链栈也是链表,只不过其规定只能在一端进行插入和删除操作
链表的建立有头插法和链表尾法,根据存储结构和链表的定义,我们可以用头插法建立一个链栈
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
typedef int SElemType;
typedef int Status;
struct LinkStack{ //链栈类型定义
SElemType data;
struct LinkStack *next;
};
struct LinkStack*creat_head_link(){ //建立头指针,要理解前面学习的头插法
LinkStack *head;
head=(struct LinkStack*)malloc(sizeof(struct LinkStack));
if(!head){
printf("不能成功分配存储空间!");
exit(0);
}
head->next=NULL;
return head;
}
Status Push(LinkStack *head,SElemType e){ //入栈操作
struct LinkStack *p;
p=(struct LinkStack*)malloc(sizeof(struct LinkStack));
if(!p)
exit(0);
p->data=e;
p->next=head->next;
head->next=p;
return OK;
}
Status Pop(LinkStack *head,SElemType *e){ //出栈操作
LinkStack *p=head->next;
if(p==NULL){
printf("线性表为空!");
exit(0);
}
head->next=p->next;
*e=p->data;
free(p);
return OK;
}
Status output(LinkStack *head){
LinkStack *p=head->next;
if(p==NULL){
printf("栈已空!\n");
return ERROR;
}
else
printf("%d\n ",p->data);
return OK;
}
void main(){
LinkStack *head;
SElemType e;
head=creat_head_link();
printf("请输入插入的元素e:\n");
scanf("%d",&e);
Push(head,e);
printf("插入e后的链栈:\n");
output(head);
Pop(head,&e);
printf("删除栈顶元素后的链栈:\n");
output(head);
printf("删除的栈顶元素:%d\n",e);
system("pause");
}