c语言之动态栈的功能实现
2015-10-31 21:24
477 查看
#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct Node { int data; struct Node * pNext; }NODE,*PNODE; typedef struct Stack { PNODE pTop; PNODE pBottom; }STACK,*PSTACK; //在函数声明时可以只写变量类型,不写形参的变量名 void initStack(PSTACK pS);//初始化 bool push(int val,PSTACK pS);//压栈 bool pop(PSTACK pS,int * val);//出栈并返回元素 bool isEmpty(PSTACK); void travelStack(PSTACK); void clear(PSTACK pS); int main() { bool p,q,r,s; int val; PSTACK pS = (PSTACK)malloc(sizeof(STACK)); //PSTACK pS;之前写成了这样没有分配内存导致程序退出,还有一种解决办法:STACK pS;initStack(&pS) r = isEmpty(pS); if(r) printf("该栈为空栈\n"); else printf("该栈不为空\n"); initStack(pS); p = push(1,pS); if(p) { printf("入栈成功\n"); } else { printf("入栈失败\n"); } r = isEmpty(pS); if(r) printf("该栈为空栈\n"); else printf("该栈不为空\n"); /* q = pop(pS,&val); if(q) printf("出栈元素为:%d\n",val); s = isEmpty(pS); if(s) printf("该栈为空栈\n"); else printf("该栈不为空\n"); */ travelStack(pS); clear(pS); r = isEmpty(pS); if(r) printf("该栈为空栈\n"); else printf("该栈不为空\n"); return 0; } void initStack(PSTACK pS) { pS->pTop = (PNODE)malloc(sizeof(NODE)); if(pS->pTop == NULL) { printf("动态内存分配失败,程序退出\n"); exit(-1); } pS->pBottom = pS->pTop; pS->pTop->pNext = NULL; //是next不是pS->pTop = NULL;这会导致pS永远不为空!! } bool push(int val,PSTACK pS) { PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(pNew == NULL) { return false; } else { pNew->data = val; pNew->pNext = pS->pTop; pS->pTop = pNew; return true; } } //bool pop(PSTACK pS,int val)切记不要把*丢掉,因为只把变量名传进去是不会改变元素的值的,只有把地址传进去才可以!!! bool pop(PSTACK pS,int * val) { if(isEmpty(pS)) { return false; } else { PNODE p = pS->pTop; *val = p->data; pS->pTop = p->pNext; free(p); p = NULL; return true; } } bool isEmpty(PSTACK pS) { PNODE p = pS->pTop; if(p != pS->pBottom) return false; return true; } void travelStack(PSTACK pS) { if(isEmpty(pS)) { return; } else { PNODE p = pS->pTop; while(p != pS->pBottom) { printf("%d\t",p->data); p = p->pNext; } printf("\n"); } } void clear(PSTACK pS) { if(isEmpty(pS)) { return; } else { PNODE p = pS->pTop; PNODE q = NULL; while(p != pS->pBottom) { q = p->pNext; free(p); p = q; } pS->pTop = pS->pBottom;//不写这句话会导致pS一直不为空! } }
相关文章推荐
- printf()问题
- 《C++ primer》英文第五版阅读笔记(五)——const
- 深入理解C++中的mutable关键字
- POJ_1781_In Danger_约瑟夫问题
- C++学习笔记20——顺序容器的操作
- Hanoi Tower
- c语言const和c++的const的区别
- 《C++ primer》英文第五版阅读笔记(四)——复合类型
- 求1到n中取几个数使和为m
- 操作系统实验一进程管理
- 在字符串中找出第一个只出现一次的字符。经典C语言例题
- 二叉树中相距最远的两个节点之间的距离
- C++实现图的十字链表表示及相关各算法
- 对C++中访问private变量的思考
- 基于Boost库C++文件夹级别数据批处理
- C++中map的使用
- c++primer 第九章习题(1)
- [C++] Function Template - optional parameter
- C语言:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出'b'
- 我的菜鸟路,第一次在ubuntu 13.10系统上运行c++程序