用一个简单的
栈函数库,可以很好地说明动态数据结构。此函数库使用动态链表,包含初始化、清除、压入和弹出等操作的函数。它的头文件如下:
/* 栈函数库:
提供对一个整数(很容易改成其他类型)栈的
最简单操作。 */
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。
|