c语言链表,请高手指点

来源:互联网 发布:用一淘下单算淘宝客吗 编辑:程序博客网 时间:2024/05/19 08:44
# 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");  }