c语言销毁栈函数对照表 销毁栈的函数

C语言销毁栈和队列问题

你这里“栈”是用一个单独的结构变量Stack①来存储的,其成员之一为栈顶的指针top。清空栈指的是把把栈里的元素都清除掉,但栈本身还在(此时栈为空栈)。而销毁栈则把①也给销毁掉了。对队列的操作也类似。

创新互联服务项目包括松北网站建设、松北网站制作、松北网页制作以及松北网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,松北网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到松北省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

C语言 清除栈中的所有元素ClearStack(struct SqStack * MyStack)

#include stdio.h

#include conio.h

#include stdlib.h

#define elemType int /* 链栈元素数据类型 */

#define SNODE_SIZE sizeof (struct sNode) /* 链栈结点空间大小 */

#define status int /* 状态型变量 */

#define OVERFLOW -1 /* 内存溢出状态码 */

#define ERROR 0 /* 错误状态码 */

#define OK 1 /* 正确状态码 */

/* 链栈结点存储结构 */

typedef struct sNode {

elemType data;

struct sNode *next;

} sNode, *sNodePtr;

/* 链栈存储结构 */

typedef struct linkStack {

sNodePtr top; /* 栈顶指针 */

} linkStack;

/* 初始化 */

/* 操作结果:构造一个带头结点的空链栈S */

void initStack (linkStack *S) {

S-top = (sNodePtr) malloc (SNODE_SIZE); /* 产生头结点,栈顶指针指向此头结点 */

if (!S-top) /* 内存分配失败 */

exit (OVERFLOW);

S-top-next = NULL;

}

/* 销毁 */

/* 初始条件:链栈S已存在。操作结果:销毁链栈S */

void destroyStack (linkStack *S) {

sNodePtr p, q;

p = S-top; /* p指向S的头结点 */

while (p) {

q = p-next; /* q指向p的下一个结点 */

free (p); /* 回收p指向的结点 */

p = q; /* p移动到下一个结点 */

} /* 直到没有下一个结点 */

}

/* 清空 */

/* 初始条件:链栈S已存在。操作结果:将S重置为空栈 */

void clearStack (linkStack *S) {

sNodePtr p, q;

p = S-top-next; /* p指向栈的第一个结点 */

while (p) {

q = p-next; /* q指向p的下一个结点 */

free (p); /* 回收p指向的结点 */

p = q; /* p移动到下一个结点 */

}  /* 直到没有下一个结点 */

S-top-next = NULL;

}

/* 判断链栈是否为空 */

/* 初始条件:链栈S已存在。操作结果:若S为空链栈,则返回TRUE,否则返回FALSE */

status stackIsEmpty (linkStack *S) {

return S-top-next == NULL;

}

/* 入栈 */

/* 操作结果:在S的栈顶插入新的元素e */

status push (linkStack *S, elemType e) {

sNodePtr p;

p = (sNodePtr) malloc (SNODE_SIZE); /* 产生新结点 */

if (!p) /* 内存分配失败 */

exit (OVERFLOW);

p-data = e;

p-next = S-top-next; /* 将新结点链接到原栈顶 */

S-top-next = p; /* 栈顶指向新结点 */

}

/* 打印栈内容 */

/* 初始条件:链栈S已存在。操作结果:当栈不为空时,打印栈内容并返回OK,否则返回ERROR */

status printStack (linkStack *S) {

sNodePtr p;

if (stackIsEmpty (S)) {

puts ("The stack is empty! ");

return ERROR;

}

p = S-top-next;

while (p) {

printf ("%d\t", p-data);

p = p-next;

}

putchar ('\n');

return OK;

}

int main (void) {

linkStack S;

elemType e; 

elemType a, b, c, d;

a = 1; b = 2; c = 3; d = 4;

initStack (S);

push (S, a);

push (S, b);

push (S, c);

push (S, d);

printf ("S:\t");

printStack (S);

putchar ('\n');

puts ("Clear the stack");

clearStack (S);

printf ("S:\t");

printStack (S);

destroyStack (S);

getch (); /* 屏幕暂留 */

return 0;

}

如有问题,点击头像联系我

c语言销毁栈的函数。大家看看写的对不?

这两个函数一个是销毁栈DestroyStack,一个是清空栈ClearStack

销毁是把整个栈都释放掉,清空只是把栈里元素清除。

因为你的栈元素是int型基本变量,所以栈元素内容是直接存放在栈空间的,并没有另外申请内存保存栈元素,所以在从栈里移除栈元素时,不需要调用free函数。

实际上你的DestroyStack可以很直接的如下:

int DestroyStack(stack s)

{

free(s.base); //释放栈空间,这里假设s.base是个指针而不是数组

//如果s结构也是动态申请的,也需要执行free(s);

}

至于ClearStack,书上写的是没问题的,清空栈,不是要释放栈空间,而是把栈里的元素都清除,最直接的做法就是把栈顶指针指向栈底指针,栈顶和栈底指针相同时,就表示栈内无元素,栈空间还是保留,下次可以继续把栈元素压栈和弹栈。


本文标题:c语言销毁栈函数对照表 销毁栈的函数
文章起源:http://pwwzsj.com/article/hpsedo.html