C语言正向链表栈的实现

来源:互联网 发布:下载windows支持软件慢 编辑:程序博客网 时间:2024/06/09 21:18

主要就是在尾节点插入,在尾节点删除

#include<stdio.h>#include<stdlib.h>#define datatype inttypedef 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的数据传递给pdatapdata->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);}}
这里栈的操作依旧是传统的先进先出,而内存中的栈自动分配,自动释放。

0 0
原创粉丝点击