C语言正向链表栈的实现
2015-09-02 20:38
344 查看
主要就是在尾节点插入,在尾节点删除
#include<stdio.h> #include<stdlib.h> #define datatype int typedef struct LinkNode { int id;//节点的编号 datatype data;//存储数据,可以创建为任意类型 struct LinkNode *pNext; } node,*PNODE; //初始化 PNODE init(PNODE phead) { //初始化一个结点 // phead->id=0; // phead->data=0; // phead->pNext=NULL; //初始化一个指针 phead=NULL; return phead; } //压栈 PNODE push(PNODE phead,int id,datatype data) { PNODE pnew=(PNODE)malloc(sizeof(node)); pnew->id=id; pnew->data=data; pnew->pNext=NULL; //尾插法 if(phead==NULL) { phead=pnew; } else { PNODE p=NULL; p=phead; while(p->pNext!=NULL) { //循环到尾部 p=p->pNext; } p->pNext=pnew;//插入 } return phead; } PNODE pop(PNODE phead,PNODE pdata) { //用pdata存储出栈的数据 if(phead==NULL) { return NULL; } else if(phead->pNext==NULL) { //只有一个节点 //将phead的数据传递给pdata pdata->id=phead->id; pdata->data=phead->data; free(phead); phead=NULL; } else { //删除最后一个节点,只需遍历到倒数第二个节点 PNODE p=phead; while(p->pNext->pNext!=NULL) { p=p->pNext; } pdata->id=p->pNext->id; pdata->data=p->pNext->data; free(p->pNext); p->pNext=NULL; } return phead; } PNODE clear(PNODE phead) { if(phead==NULL) { return NULL; } else { /*每次删除头结点 free(phead); clear(phead->pNext);*/ //先删除头结点后面的一个节点,最后删除头节点 PNODE p1,p2; p1=phead; p2=NULL; while(p1->pNext!=NULL) { p2=p1->pNext;//保存第二个节点 p1=p2->pNext;//p1指向p2的下一个节点 phead->pNext=p1; free(p2); } free(phead); phead=NULL; return phead; } } //显示全部数据 void showall(PNODE phead) { if(phead==NULL) { return; } else { printf("%d,%d,%p,%p\n",phead->id,phead->data,phead,phead->pNext); showall(phead->pNext); } } //验证,十进制转成二进制 void tenToTwo(int num) { if(num==0) { return; } else { printf("%d",num%2); tenToTwo(num/2); } } main() { // tenToTwo(10); // printf("\n"); PNODE phead=NULL; phead=init(phead); // for(int i=0;i<10;i++){ // //入栈 // phead=push(phead,i,100+i); // } // // showall(phead); int num=1000; while(num) { phead=push(phead,num%2,num/2); num/=2; } while(phead!=NULL) { node nd; phead=pop(phead,&nd); printf("id=%d,data=%d\n",nd.id,nd.data); } printf("-----------------------------------------\n"); num=1000; phead=clear(phead);//重新利用 while(num) { phead=push(phead,num%2,num/2); num/=2; node nd; phead=pop(phead,&nd); printf("id=%d,data=%d\n",nd.id,nd.data); } }这里栈的操作依旧是传统的先进先出,而内存中的栈自动分配,自动释放。
相关文章推荐
- c++ iterator(迭代器)分类及其使用
- C++命名空间
- TQ2440 学习笔记—— 14、GPIO 接口【实验:用C语言实现】
- C语言正数和负数循环右移,左移,把某正数的第m位(从0开始)到n位取反
- 【C++】类和对象(构造与析构)
- c++ set的常用用法
- 并查集的简介及其C/C++代码的实现及优化
- C++链接与装载
- C++ auto_ptr
- C++primer 阅读笔记-模板与泛型编程(成员模板)
- C++项目开发常用的开源库
- C++模板元编程 - 1 基本数据类型和运算
- 协变(Covariance)与逆变(Contravariance)
- 从 C/C++ 程序调用 Java 代码
- 漫谈C指针第三讲---指针是什么东西
- 一些不常见的C++关键字
- Python调用C++程序备忘笔记
- [C++][编程风格]C++命名规则
- Android-使用C++实现调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(八)
- 带重复元素的排列