C语言反向链式栈的实现

与正向的区别就是在头节点插入,在头节点删除。可以看出链表的操作很相似。

#include
#include

#define datatype int

typedef struct LinkNode {
	int id;//节点的编号
	datatype data;//存储数据,可以创建为任意类型
	struct LinkNode *pNext;
} node,*PNODE;

//初始化
PNODE init(PNODE phead) {
	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 {
		pnew->pNext=phead;
		phead=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;
		phead=phead->pNext;
		pdata->id=p->id;
		pdata->data=p->data;
		free(p);
	}
	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);
	}
}

main() {

	PNODE phead=NULL;
	phead=init(phead);
	for(int i=0;i<10;i++){
		//入栈
		phead=push(phead,i,100+i);
	}

	showall(phead);

}

C语言反向链式栈的实现_第1张图片

你可能感兴趣的:(C)