数据结构-C语言实现-单链表(尾插法)

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <ctype.h>
  4 #include <string.h>
  5 #define NAME 20//分配空间大小
  6 #define SEX 6//分配空间大小
  7 typedef struct LinkList{
  8   char *name;
  9   char *sex;
 10   int age;
 11   struct LinkList * next;
 12 }LinkList;
 13 LinkList * createList(){
 14   LinkList * p=(LinkList *)malloc(sizeof(LinkList));//初始化头结点
 15   p->next=NULL;//头结点指向的下一个结点为空
 16   return p;//返回已初始化的链表
 17 }
 18 char * GetName(){//返回名字
 19   char *p=(char *)malloc(sizeof(char)*NAME);
 20   printf("请输入名字:");
 21   scanf("%s",p);
 22   return p;
 23 }
 24 char * GetSex(){//返回性别
 25   char *p=(char *)malloc(sizeof(char)*SEX);
 26   printf("请输入性别:");
 27   scanf("%s",p);
 28   return p;
 29 }
 30 int GetAge(){//返回年龄
 31   int age;
 32   printf("请输入年龄:");
 33   scanf("%d",&age);
 34   return age;
 35 }
 36 LinkList * Getpos(LinkList *p,char *name){//查找name出现的结点返回该结点
 37   LinkList *pos = p->next;
 38   while(pos)//当结点不为空时
 39     if(strcmp(pos->name,name)==0)//如果找到结点
 40     return pos;//返回
 41     else
 42     pos=pos->next;//匹配下一个结点
 43 }
 44 void DeleNode(LinkList *p){//获取要指向删除的节点位置的结点
 45   printf("输入你要删除的人的名字\n");
 46   char name[NAME];
 47   strcpy(name,GetName());
 48   LinkList * ptr = p;//指向被找到的结点的上一个结点
 49   LinkList *pr = p->next;//指向第一个结点
 50   while(pr)
 51     if(strcmp(pr->name,name)==0){//匹配成功
 52       ptr->next=pr->next;//被删除结点的上一个结点指向被删除结点的下一个结点
 53       free(pr);//释放结点
 54     }
 55     else{
 56       ptr=pr;
 57       pr=pr->next;
 58     }
 59 }
 60 void ShowList(LinkList *p){
 61   LinkList * pr=p->next;
 62   while(pr){
 63     printf("姓名:%s 性别:%s 年龄:%d\n",pr->name,pr->sex,pr->age);
 64     pr=pr->next;
 65   }
 66 }
 67 void ShowSB(LinkList *pos){
 68   printf("姓名:%s 性别:%s 年龄:%d\n",pos->name,pos->sex,pos->age);
 69 }
 70 void InsertNode(LinkList *p){//插入在pos结点后
 71   LinkList * instead = (LinkList *)malloc(sizeof(LinkList));//创建一个结点以插入
 72   printf("请输入要插入的信息:");
 73   instead->name= GetName();//获取姓名
 74   instead->sex= GetSex();//获取性别
 75   instead->age= GetAge();//获取年龄
 76   printf("要插在哪位的后面(姓名):");
 77   LinkList *pos=Getpos(p,GetName());
 78   LinkList * pr=pos->next;
 79   pos->next=instead;
 80   instead->next=pr;
 81 }
 82 void AddNode(LinkList *p,char *name,char *sex,int age){//p指向第一个头结点,头结点指针指向第一个结点
 83   LinkList * pr= p;
 84   LinkList * info = (LinkList *)malloc(sizeof(LinkList));//分配空间
 85   info->name= name;//获取姓名
 86   info->sex= sex;//获取性别
 87   info->age= age;//获取年龄
 88   info->next=NULL;
 89   while(pr->next)
 90     pr=pr->next;
 91   pr->next=info;
 92   // printf("姓名:%s 性别:%s 年龄:%d\n",pr->name,pr->sex,pr->age);
 93 }
 94 void menu(){
 95   printf("键入以下选项来操作,ctrl+z以退出!\nA:添加数据\nB:打印列表\nC:按名插入数据\nD:按名删除数据\nE:按名查找详细信息\n");
 96 }
 97 void main(){
 98   LinkList *head = createList();
 99   char ch;
100   menu();
101   while((ch=getchar())!=EOF){
102     setbuf(stdin,NULL);
103     switch (toupper(ch)){
104       case 'A': AddNode(head,GetName(),GetSex(),GetAge());break;
105       case 'B': ShowList(head);break;
106       case 'C': InsertNode(head);break;
107       case 'D': DeleNode(head);break;
108       case 'E': ShowSB(Getpos(head,GetName()));break;
109     }
110   menu();
111   setbuf(stdin,NULL);
112   }
113 }

 

posted @ 2020-05-21 09:34  四字又名  阅读(705)  评论(0)    收藏  举报