#include<stdio.h>
typedef int datatype;
typedef struct node //链栈的定义
{
datatype data;
struct node *next;
}Stacknode,*Linkstack;
Linkstack Init_Linkstack() //链栈置空
{
return NULL;
}
int Empty_Linkstack(Linkstack top) //判断空栈
{
if(top==NULL) return 1;
else return 0;
}
Linkstack Push_Linkstack(Linkstack top,datatype e) //入栈
{
Stacknode *s;
s=malloc(sizeof(Stacknode));
s->data=e;
s->next=top;
top=s;
return top;
}
Linkstack Pop_Linkstack(Linkstack top,datatype *e) //出栈
{
Stacknode *p;
if(top==NULL) {printf("链栈为空栈\n");return NULL;}
else
{
*e=top->data;
p=top;
top=top->next;
free(p);
printf("出栈成功,出栈元素为%d\n",*e);
return top;
}
}
datatype Gettop_Linkstack(Linkstack top) //取栈顶元素
{
if(top==NULL)return NULL;
else return top->data;
}
Linkstack Creat_Linkstack()
{
int e;
Stacknode *p;
p=Init_Linkstack();
do
{
scanf("%d",&e);
p=Push_Linkstack(p,e);
}while(getchar()!='\n');
return p;
}
void out_Linkstack(Linkstack top) //输出链栈
{
Stacknode *p=top;
if(p==NULL) //排除空链栈
{
printf("空链表无法输出\n");
return -1;
}
printf("该链栈为:\n栈顶||");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("||栈底\n");
}
void Num_Linkstack(Linkstack top,datatype e)
{
int i=0;
Stacknode *s;
s=top;
while(s!=NULL)
{
i++;
if(s->data==e)
{
printf("该元素距栈顶第%d位\n",i);
return;
}
s=s->next;
}
printf("链栈内不存在该数\n");
}
void Loc_Linkstack(Linkstack top,datatype e)
{
int i=0;
Stacknode *s;
s=top;
while(s!=NULL)
{
i++;
if(i==e)
{
printf("距栈顶位置为第%d位的元素为%d\n",i,s->data);
return;
}
s=s->next;
}
printf("链栈内不存在该位置\n");
}
Linkstack resort_Linkstack(Linkstack top,datatype e,int m)
{
int i=0;
Stacknode *s;
s=top;
while(s!=NULL)
{
i++;
if(i==e)
{
s->data=m;
out_Linkstack(top);
return top;
}
s=s->next;
}
printf("链栈内不存在该位置\n");
return top;
}
int main()
{
int n,m;
datatype e;
Linkstack top;
Stacknode *p;
printf("创建链栈\n");
top=Creat_Linkstack();
out_Linkstack(top);
A:
printf("****************************\n");
printf("请数字选择对链栈的操作\n0:结束操作\n1:修改元素\n2:判断空栈\n3:入栈\n4:出栈\n5:取出栈顶元素\n6:输出栈\n7:按值查找\n8:按位置查找\n");
printf("****************************\n功能选择为:");
scanf("%d",&n);
switch(n)
{
case 0:printf("操作结束\n");return 0;
case 1:
{
printf("请输入要修改位置:");
scanf("%d",&e);
printf("输入要修改后的数值:");
scanf("%d",&m);
top=resort_Linkstack(top,e,m);
break;
}
case 2:
{
m=Empty_Linkstack(top);
if(m==1) printf("该链栈为空栈\n");
else printf("该链栈不为空栈\n");
break;
}
case 3:
{
printf("请输入入栈元素e: ");
scanf("%d",&e);
top=Push_Linkstack(top,e);
out_Linkstack(top);
break;
}
case 4:
{
top=Pop_Linkstack(top,&e);
out_Linkstack(top);
break;
}
case 5:
{
e=Gettop_Linkstack(top);
if(e==NULL) printf("链栈为空栈\n");
else printf("栈顶元素为%d\n",e);
break;
}
case 6:out_Linkstack(top);break;
case 7:
{
printf("请输入查找数值:");
scanf("%d",&e);
Num_Linkstack(top,e);
break;
}
case 8:
{
printf("请输入元素距栈顶位置i:");
scanf("%d",&e);
Loc_Linkstack(top,e);
break;
}
default:printf("选择错误,请重新选择\n");break;
}
getchar();
printf("请输入回车继续");
getchar();
system("cls");
out_Linkstack(top);
goto A;
}