#include <stdio.h>
#include <stdlib.h>
typedef struct Lnode{
int data;//数据域
struct Lnode*next;//指针域
}Lnode,*LinkList;
/*初始化栈*/
LinkList InitList(){
LinkList L=(LinkList)malloc(sizeof(Lnode));//这里我们是有头结点的
L->data=0;//头节点数据域存放栈长
L->next=NULL;//指针域
}
/*入栈*/
void PushIn(LinkList L){
LinkList q,p;
int i,j,x;
q=L;//尾指针
printf("请输入入栈个数\n");
scanf("%d",&x);
printf("请输入入栈的数据\n");
for(i=0;i<x;i++){
p=(LinkList)malloc(sizeof(Lnode));//建立结点
scanf("%d",&j);//输入要加入的数据
p->data=j;
p->next=NULL;
q->next=p;
q=p;//更新尾指针,栈只能在尾部插入数据
L->data++;
}
}
/*销毁栈*/
void DestroyList(LinkList L){
LinkList q;
int i;
for(i=0;i<L->data;i++){//有几个数据就释放几个结点空间
q=L;
L=L->next;
free(q);
}
}
/*出栈*/
void PushOut(LinkList L){
LinkList q,p;
int i,j;
q=L;
printf("请输入出栈个数\n");
scanf("%d",&j);
printf("出栈的数据为:");
while(j){
for(i=0;i<L->data;i++){//找出栈顶
q=q->next;
}
printf("[%d]",q->data);//打印栈顶数据
free(q); //释放栈顶
j--;//循环减一
L->data--;//长度减一
q=L;//重新给q赋L的地址,下次找栈尾
}
printf("\n");
}
/*求栈中数据个数*/
void ListLenght(LinkList L){
printf("栈中数据个数为:%d\n",L->data);
}
/*求栈顶的数据*/
void Topdata(LinkList L){
LinkList p;
int i;
p=L;
if(L->data==0){
printf("该栈为空栈\n");
}
else{
for(i=0;i<L->data;i++){//找栈尾地址
p=p->next;
}
printf("栈顶的数据为:[%d]\n",p->data);//打印栈尾的数据
}
}
/*向栈顶插入数据*/
void InsertTop(LinkList L){
LinkList p,q;
int i,j,x;
p=L;
for(i=0;i<L->data;i++){//找到栈顶结点的地址
p=p->next;
}
printf("请输入你要插入的个数\n");
scanf("%d",&j);
printf("请输入你要插入的数据\n");
for(i=0;i<j;i++){//进入循环,根据你要插入几个数据循环几次
q=(LinkList)malloc(sizeof(Lnode));
scanf("%d",&x);
q->data=x;
q->next=NULL;
p->next=q;
p=q;//更新栈顶地址
L->data++;//长度加一
}
}
/*查看栈中的数据*/
void ShowList(LinkList L){
LinkList p;
int i;
p=L->next;
if(L->data==0){
printf("该栈为空栈\n");
}
else{
printf("目前栈中的数据为:");
for(i=0;i<L->data;i++){//遍历链表,有几个数据就遍历几个
printf("[%d]",p->data);
p=p->next;
}
printf("\n");
}
}
int main(int argc, char *argv[]) {
LinkList L;
L=InitList();//初始化头结点
ListLenght(L);
PushIn(L);
ListLenght(L);
ShowList(L);
PushOut(L);
ShowList(L);
ListLenght(L);
Topdata(L);
InsertTop(L);
ListLenght(L);
ShowList(L);
PushOut(L);
DestroyList(L);
return 0;
}
#效果展示