本文为CSDN博主coder_gxd原创
转载请注明:https://blog.csdn.net/coder_gxd/article/details/79841031
本文介绍数据结构中单链表的常用算法(C/C++版),欢迎各位同学讨论指正。
#include <stdlib.h>//函数malloc(),free()所在头文件
//本文链栈为含有头结点的链栈
//定义链栈结点
typedef struct LNode {//链栈结点定义延用单链表定义
int data;//数据域
struct LNode *next;//指针域
}LNode;
//链栈初始化代码,时间复杂度为O(1);
//创建空栈lst,并初始化为空
void initStack(LNode *&list){//链栈头结点作为栈顶结点
lst=(LNode *)malloc(sizeof(LNode));
lst->next=NULL;
}
//判断栈空,时间复杂度为O(1);
//栈空返回1,否则返回0;
int isEmpty(LNode *lst){
if(lst->next==NULL){
return 1;
}
else{
return 0;
}
}
//进栈操作,时间复杂度为O(1);
//将数据元素 x 进栈,一般不存在栈满情况(除非超出内存)
void push (LNode *lst,int x){
LNode *p;
p=(LNode *)malloc(sizeof(LNode));
p->next=NULL;//此句省略也正确,但每创建一个结点就使之next=NULL,是一个避免错误的好习惯;
p->data=x;//这两句用来创建链栈结点p,并存储x;
p->next=lst->next;
lst->next=p;//这两句将结点 p 链接在头结点后;
}
//出栈操作,时间复杂度为O(1);
//链栈lst出栈,出栈数据赋给x,若成功返回1,链空,出栈失败返回0;
void pop (LNode *lst,int &x){
if(lst->next==NULL){//链空,出栈失败返回0;
return 0;
}
LNode *p=lst->next;
x=p->data;
lst->next=p->next;//这三句实现删除链栈结点操作;
}