c语言链表问题,希望高手指点

来源:互联网 发布:用一淘下单算淘宝客吗 编辑:程序博客网 时间:2024/06/06 06:22
# include # include # include # 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 && jnext;++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 && jnext;++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 && jnext;++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"); }
原创粉丝点击