<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
char data;
struct LNode *next;
}LNode,*Linklist;
int flag=0;
void menu()
{
printf("\t链表的基本操作实验\t\t\n");
printf("*****************************************\n");
printf("*请选择命令序号(0——7):\t\t*\n");
printf("*1 创建链表;\t\t\t\t*\n");
printf("*2 链表插入;\t\t\t\t*\n");
printf("*3 链表删除;\t\t\t\t*\n");
printf("*4 链表长度;\t\t\t\t*\n");
printf("*5 链表是否为空;\t\t\t*\n");
printf("*6 链表输出;\t\t\t\t*\n");
printf("*7 链表销毁;\t\t\t\t*\n");
printf("*0 程序退出;\t\t\t\t*\n");
printf("*****************************************\n");
}
void Creatlist_0(Linklist *l)
{
int i,n;
Linklist p;
char ch;
printf("请输入单链表的长度:\n");
scanf("%d",&n);
*l=(Linklist)malloc(sizeof(LNode));
(*l)->next=NULL;
for(i=0;i<n;i++)
{
printf("请输入链表中元素:\n");
p=(Linklist)malloc(sizeof(LNode));
scanf("%c",&ch);
if((ch=getchar())!='\n')
{
p->data=ch;
p->next=(*l)->next;
(*l)->next=p;
}
}
flag=1;
}
void Creatlist_1(Linklist *l)
{
int i,n;
Linklist p,r;
char ch;
printf("请输入单链表的长度:\n");
scanf("%d",&n);
*l=(Linklist)malloc(sizeof(LNode));
(*l)->next=NULL;
r=*l;
for(i=0;i<n;i++)
{
printf("请输入链表中元素:\n");
p=(Linklist)malloc(sizeof(LNode));
scanf("%c",&ch);
if((ch=getchar())!='\n')
{
p->data=ch;
p->next=r->next;
r->next=p;
r=p;
}
}
flag=1;
}
int Lengthlist(Linklist l)
{
int len=0;
Linklist p=l->next;
while(p)
{
len++;
p=p->next;
}
return len;
}
void Insertlist(Linklist l,int i,char e)
{
int j;
Linklist p=l,r;
if(i<1||i>Lengthlist(l)+1)
printf("无法插入!\n");
else
{
for(j=0;j<i-1;j++)
p=p->next;
r=(Linklist)malloc(sizeof(LNode));
r->data=e;
r->next=p->next;
p->next=r;
}
}
void Deletelist(Linklist *l,int i)
{
int j;
Linklist p=*l,r;
if(i<1||i>Lengthlist(*l))
printf("无法删除!\n");
else
{
for(j=0;j<i-1;j++)
p=p->next;
r=p->next;
p->next=r->next;
free(r);
}
}
void Emptylist(Linklist l)
{
if(flag==0)
printf("链表未创建,不能执行判空操作!\n");
else if(l->next==NULL)
printf("链表为空!\n");
else
printf("链表不为空!\n");
}
void Displaylist(Linklist l)
{
if(flag==0)
printf("链表未创建,不能执行显示操作!\n");
else if(l->next==NULL)
printf("链表为空!\n");
else
{
Linklist p=l->next;
while(p)
{
printf("%c->",p->data);
p=p->next;
}
printf("NULL\n");
}
}
void Destorylist(Linklist l)
{
Linklist p=l,q=l->next;
while(q)
{
free(p);
p=q;
q=q->next;
}
free(p);
flag=0;
}
int main()
{
Linklist l;
int i,select;
char e;
while(1)
{
menu();
printf("请输入命令号(0——7):\n");
scanf("%d",&select);
switch(select)
{
case 1:
printf("请选择插入方法(0为头插法,1为尾插法):\n");
while(scanf("%d",&i))
{
if(i==0||i==1)
break;
else
{
printf("输入不对,请重新输入(1为头插法,2为尾插法):\n");
continue;
}
}
if(i==0)
Creatlist_0(&l);
else
Creatlist_1(&l);
break;
case 2:
if(flag==1)
{
printf("请输入插入位置:\n");
scanf("%d",&i);
printf("请输入插入的字符:\n");
getchar();
scanf("%c",&e);
Insertlist(l,i,e);
}
else
printf("链表未创建,不能执行插入操作!\n");
break;
case 3:
if(flag==0)
printf("链表未创建,不能执行删除操作!\n");
else
{
printf("请输入删除位置:\n");
scanf("%d",&i);
Deletelist(&l,i);
}
break;
case 4:
if(flag==0)
printf("链表未创建,不能计算长度!\n");
else
printf("链表的长度为:%d\n",Lengthlist(l));
break;
case 5:
Emptylist(l);
break;
case 6:
Displaylist(l);
break;
case 7:
if(flag==0)
printf("链表未创建,怎么销毁?\n");
else
Destorylist(l);
break;
case 0:
exit(1);break;
default :
printf("命令输入有误,请重新输入:\n");
break;
}
}
return 0;
}
</span>