# include<dos.h>
# include<stdio.h>
# include<stdlib.h>
# define LEN sizeof (LNode) //定义LEN为一个字节长度
enum BOOL {False,True};
typedef struct LNode
{ char data; //数据域
struct node *next; //指向下一个节点的指针
} LNode, *LinkList;
void GreatList (LinkList&,int); //生成单链表
BOOL ListFind (LinkList,char&,int); //查找
BOOL ListInsert (LinkList&,int,char); //插入
BOOL ListDelete (LinkList&,int,char&); //删除
void ListPrint (LinkList); //显示单链表所有元素
void main()
{ LinkList L;
BOOL temp;
int num,loc,flag=1;
char j,ch;
// 程序解说
printf("本程序实现链式结构的线性表的操作。\n");
printf("可以进行查找、删除、插入操作。\n");
printf("请输入初始时链表长度:"); //单链表元素个数
scanf("%d",&num);
GreatList(L,num); //生成单链表
ListPrint(L);
while(flag)
{ printf("请选择:\n");
printf("1.显示所有元素\n");
printf("2.按序号查找元素\n");
printf("3.插入一个元素\n");
printf("4.删除一个元素\n");
printf("5.退出程序!\n");
scanf("%c",&j);
switch(j)
{ case'1': ListPrint(L);break;
case'2': { if(L->next==NULL)
printf("链表为空!\n");
else printf("请输入要查找的元素的位置:\n");
scanf("%d",&loc); //输入要查找的位置
temp=ListFind(L,ch,loc); //按关键字查找
if(temp=False) printf("该位置不存在!\n");
else printf("第%d个元素是:%c/n",loc,ch);
break;
}
case'3': { printf("请输入一个字符和要插入的位置(例如:a,3):\n");
scanf("%c,%d",&ch,&loc);
temp=ListInsert(L,loc,ch); //插入
if(temp=False) printf("插入失败!\n");
else printf("插入成功!/n");
ListPrint(L);
break;
}
case'4': { printf("请输入要删除的元素所在位置:\n");
scanf("%d",&loc);
temp=ListDelete(L,loc,ch); //删除
if(temp=False) printf("删除失败!\n");
else printf("成功删除元素:%c\n",ch); //删除成功,显示该元素
ListPrint(L);
break;
}
break;
default:flag=0; printf("程序结束,按任意键退出!\n");
}
}
getchar();
}
void GreatList(LinkList &v,int n)
{ int i;
LinkList p;
v=(LinkList)malloc(LEN); //生成头结点
v->next=NULL;
printf("请输入%d个字符(例如:abcdefg):\n",n);
getchar();
for(i=n;i>0;--i)
{ p=(LinkList)malloc(LEN); //生成新结点
scanf("%c",&p->data);
p->next=v->next;
v->next=p;
}
}
BOOL ListFind(LinkList v,char &e,int i)
{ // 查找第i个元素,成功返回True,并用e返回该元素值,失败返回False
LinkList p;
int j=0;
p=v;
while (p->next && j<i) { p=p->next;++j;} //移动指针,直到找到第i个元素
if(j!=i) return False;
else {e=p->data; //查找成功,用e取得该元素值
return True;
}
}
BOOL ListInsert(LinkList &v,int i,char e)
{ //在第i个位置插入元素e,成功返回True,失败返回False
LinkList p,s;
int j=0;
p=v;
while (p && j<i-1) { p=p->next;++j;} //寻找第i-1个结点
if(!p||j>i-1) return False; //i小于1或者大于表长加1
s=(LinkList)malloc(LEN); //生成新结点
s->data=e;
s->next=p->next; //插入链表中
p->next=s;
return True;
}
BOOL ListDelete(LinkList &v,int i,char &e)
{ //删除第i个元素,成功返回True,并用e返回该元素,失败返回False
LinkList p,q;
int j=0;
p=v;
while (p && j<i-1) { p=p->next;++j;} //寻找第i-1个结点,并用p指向其前趋
if(!(p->next)||j>i-1) return False; //删除位置不合理
q=p->next; p->next=q->next; //删除该元素
e=q->data; //e取得该元素的值
free(q); //释放该元素空间
return True;
}
void ListPrint(LinkList v)
{ //显示链表所有元素
LinkList q;
q=v->next;
printf("链表所有元素:");
while(q!=NULL)
{ printf("%c",q->data);q=q->next;}
printf("\n");
}
c语言链表出现一个错误
最新推荐文章于 2022-10-24 22:12:09 发布