#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode
{
int data;
struct Lnode *next;
}Lnode,*Linklist;
void InitList(Linklist &L) //初始化
{
L=(Linklist)malloc(sizeof(Lnode));
L->next=NULL;
}
void CreatList(Linklist &L,int n) //头插法建表
{
Linklist p;
int i;
printf("\n 请输入%d个数值,中间以空格或者回车键分隔\n",n);
for(i=n;i>0;i--)
{
p=(Linklist)malloc(sizeof(Lnode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
printf("\n");
}
void JudgeList(Linklist &L,int n) //判空
{
if(L->next==NULL) printf("该表是空表。\n");
else printf("该表不是空表。\n");
}
void PutList(Linklist &L) //输出
{
Linklist p;
p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;}
printf("\n");
}
int ListInsert(Linklist &L,int i,int e) //插入
{
Linklist s,p;
s=(Linklist)malloc(sizeof(Lnode));
s->data=e;
s->next=NULL;
p=L;
int j=0;
while(&p&&j<i-1)
{
p=p->next;
++j;}
if(!p||j>i-1) return 0;
s->next=p->next;
p->next=s;
return 1;}
int ListDelete(Linklist &L,int i,int &e) //删除
{
Linklist p,q;
p=L;
int j=0;
while(p->next&&j<i-1)
{
p=p->next;
++j;}
if(!(p->next)||j>i-1) return 0;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return 1;
}
void ListReserve(Linklist &L) //逆置
{
Linklist p,q;
p=L->next;
L->next=NULL;
while(p)
{
q=p;
p=p->next;
q->next=L->next;
L->next=q;
}
}
void main()
{
int n,i,e,k,x=1;
Linklist L;
printf("\n头插法建表,");
printf("请输入长度:");
scanf("%d",&n);
InitList(L);
CreatList(L,n);
JudgeList(L,n);
printf("\n线性表的数值分别是:");
PutList(L);
printf("\n 请选择以下的操作") ;
while(x==1)
{
printf(" 1.插入 2.删除 3.逆置 \n");
scanf("%d",&k);
switch(k)
{
case 1:
printf("请输入插入数的位置:");
scanf("%d",&i);
printf("\n请输入该数的值:");
scanf("%d",&e);
if(ListInsert(L,i,e))
{
printf("插入后这些数为:");
PutList(L);
}
else
printf("\n操作失败!");
break;
case 2:
printf("\n请输入要删除的数的位置:");
scanf("%d",&i);
if(ListDelete(L,i,e))
{
printf("删除后这些数为:");
PutList(L);
}
else printf("\n 操作失败!");
break;
case 3:
ListReserve(L);
printf("逆置后的数是:");
PutList(L);break;
default:printf("输入错误!");}
printf("\n继续请按1,退出请按2:");
scanf("%d",&x);
}
}
评论0