【链式栈】链式栈的封装<源代码>
2016-05-01 13:23
323 查看
//编译环境 VS3013 / //头文件 stacklinknode.h
#include<stdio.h> #include<stdlib.h> #define datatype int struct STACKNODE { int num;//编号 datatype data;//数据 struct STACKNODE *pNext; }; typedef struct STACKNODE stackNode; stackNode * initStack(stackNode * pHead); stackNode * push(stackNode * pHead, int num, datatype data);//压栈 stackNode * pop(stackNode * pHead, stackNode * pOutData);//出栈 stackNode * freeAll(stackNode * pHead); void printfAllMember(stackNode *pHead); //C文件 stacklinknode.c
//#include<stdio.h> #include<stdlib.h> #include "stacklinknode.h" stackNode * initStack(stackNode * pHead) //初始化 { return NULL; } stackNode * push(stackNode * pHead, int num, datatype data)//压栈 { stackNode *pNewNode = (stackNode *)malloc(sizeof(stackNode)); pNewNode->num = num; pNewNode->data = data; pNewNode->pNext = NULL; //开辟节点并赋值 if (pHead == NULL) { pHead = pNewNode; //本来没有节点,在头部插入一个节点之后,让pHead指着 } else //已经存在节点 { stackNode *p = pHead; while (p->pNext != NULL) { p = p->pNext;//一直向前 } p->pNext = pNewNode; //插入新节点 } return pHead; } stackNode * pop(stackNode * pHead, stackNode * pOutData)//出栈 { if (pHead == NULL) { return NULL; } else if (pHead->pNext == NULL)//只有一个节点 { pOutData->num = pHead->num; pOutData->data = pHead->data; free(pHead); pHead = NULL; return pHead; } else { stackNode *p = pHead; while (p->pNext->pNext != NULL) { p = p->pNext;//循环到倒数第二个节点 } pOutData->num = p->pNext->num; pOutData->data = p->pNext->data; free(p->pNext); p->pNext = NULL; return pHead; } } stackNode * freeAll(stackNode * pHead) { if (pHead == NULL) { return NULL; } else { stackNode *p1 = NULL, *p2 = NULL; p1 = pHead; while (p1->pNext != NULL)//有超过一个节点的情况 { p2 = p1->pNext; p1->pNext = p2->pNext; free(p2); } free(pHead); //释放头结点 return NULL; //对于上边释放代码的改进,上述代码每一次删除第二个节点 //改进之后每次直接删除第一个节点。 /*stackNode * p1 = pHead; stackNode *p2 = NULL; if (p1->pNext == NULL) { free(pHead); return NULL; } else { while (p1->pNext != NULL) { p2 = p1; p1 = p2->pNext; free(p2); } return NULL; }*/ } } //递归实现 void printfAllMember(stackNode *pHead) { if (pHead == NULL) { return NULL; } else { printf("%d, %d\n", pHead->num, pHead->data);//打印数据 //printf("%p, %p\n", pHead, pHead->pNext); //打印地址 printfAllMember(pHead->pNext); } } //测试文件 #include<stdio.h> #include<stdlib.h> #include "stacklinknode.h" void main() { stackNode *pHead = NULL;//创建一个链式栈的头结点 pHead = initStack(pHead); pHead = push(pHead, 1, 1); pHead = push(pHead, 2, 2); pHead = push(pHead, 3, 3); pHead = push(pHead, 4, 4); pHead = push(pHead, 5, 5); printf("压栈之后:\n"); printfAllMember(pHead); pHead = freeAll(pHead); if (pHead == NULL) { printf("释放完成"); printfAllMember(pHead); } printf("出栈:\n"); while (NULL != pHead) { //保存出栈数据 stackNode *pout = (stackNode *)malloc(sizeof(stackNode)); pHead = pop(pHead, pout); //printfAllMember(pHead); printf("%d,%d\n", pout->num, pout->data); } system("pause"); }
相关文章推荐
- java.lang.Class.forName(String name, boolean initialize, ClassLoader loader)方法
- 关于springmvc的流程
- 第十一周项目3.2 警察和厨师 为Polic类和Cook类增加了对象成员,请扩充代码
- java.lang.Class.forName(String name, boolean initialize, ClassLoader loader)方法
- 使用CXF处理JavaBean式的复合类型和List集合类型的形参和返回值
- JAVA流程控制
- Google机器学习教程心得(一)
- 【C语言】静态顺序表的实现(包括头插、头删、尾插、尾删、查找、删除指定位置)
- python插入内容到指定文件的位置
- Java泛型
- Google机器学习教程心得(一)
- 20145305 《Java程序设计》第9周学习总结
- Sun java认证考试真题答案及部分解析(三)
- Sun java认证考试真题答案及部分解析(二)
- Sun java认证考试真题答案及部分解析(一)
- 【LeetCode】Reverse Linked List 解题报告(Python & java)
- 传智播客 2015 刘意 Java基础-视频-笔记day27(完结)(2016年5月1日12:53:07)
- SpringMVC 使用JSR-303进行校验
- Java 栈帧
- python文件绝对路径写法(windows)