您的位置:首页 > 编程语言 > C语言/C++

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);
}

}
这里栈的操作依旧是传统的先进先出,而内存中的栈自动分配,自动释放。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: