(本文为博闻网版权所有,转载必须注明出处。)

用一个简单的栈函数库,可以很好地说明动态数据结构。此函数库使用动态链表,包含初始化、清除、压入和弹出等操作的函数。它的头文件如下:

/* 栈函数库:
提供对一个整数(很容易改成其他类型)栈的
最简单操作。 */

typedef int stack_data;

extern void stack_init();
/* 初始化本函数库。
请在调用其他函数之前先调用本函数。*/

extern void stack_clear();
/* 清除栈上的所有元素。*/

extern int stack_empty();
/* 若栈为空则返回 1,否则返回 0。*/

extern void stack_push(stack_data d);
/* 将d的值压栈。*/

extern stack_data stack_pop();
/* 返回栈顶的值并删除栈顶元素,
若栈为空
则返回无用信息。*/

此函数库的实现代码文件如下:

#include "stack.h"
#include /* 栈函数库: 提供对一个整数栈的最简单操作。*/ struct stack_rec { stack_data data; struct stack_rec *next; }; struct stack_rec *top=NULL; void stack_init() /* 初始化本函数库。 请在调用其他函数之前先调用本函数。*/ { top=NULL; } void stack_clear() /* 清除栈上的所有元素。*/ { stack_data x; while (!stack_empty()) x=stack_pop(); } int stack_empty() /* 若栈为空则返回1,否则返回0。*/ { if (top==NULL) return(1); else return(0); } void stack_push(stack_data d) /* 将d的值压栈。*/ { struct stack_rec *temp; temp= (struct stack_rec *)malloc(sizeof(struct stack_rec)); temp->data=d; temp->next=top; top=temp; } stack_data stack_pop() /* 返回栈顶的值并删除栈顶元素, 若栈为空 则返回无用信息。*/ { struct stack_rec *temp; stack_data d=0; if (top!=NULL) { d=top->data; temp=top; top=top->next; free(temp); } return(d); }

请注意,这个函数库是如何进行信息隐藏的:单从头文件上无法看出栈的实现是用的数组、指针、文件或什么其他方式。还要注意NULL的使用。NULL是在stdio.h中定义的,所以使用指针的代码几乎总是要包含stdio.h。NULL即零。

动手一试
  • 请为栈函数库添加dup、count和add函数,分别用于复制栈顶元素、返回栈包含元素的数目和将栈顶端的两个元素相加。
  • 请为栈函数库编写一个测试程序和一个makefile。将栈函数库和测试程序一起编译,确定程序可以正确地工作。

C常见错误
  • 提及一个记录时(如上面的 (*p).i)时忘记加上括号。
  • 分配了内存却无法释放。例如,在栈函数中不要写top=NULL,因为那样会导致无法访问需要被释放的内存。
  • 忘记包含stdio.h。为使用NULL,请在涉及指针操作的源文件中包含stdio.h。




 打印  电子邮件  反馈  引用
编辑推荐
软件狗是什么?
软件狗(Software Dog)是一种计算机软件的加密方式,是“硬件加密锁”的
间谍软件工作原理
您的计算机是否曾变得非常慢,即使打开Word处理器也会占用很长时间,间谍软件可能
什么是路由算法?
路由器是管理网络流量和发送数据包的,但是它是如何决定数据包发送的呢?通过本文,博
Gnutella文件共...
Napster在巅峰时期或许是有史以来最受欢迎的网站。紧随其后的文件共享体系架构
主页 |  公司信息 |  广告服务 |  招聘信息 |  隐私 |  联系我们 |  帮助 |  条款和条件