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

猜你喜欢

转载自www.cnblogs.com/Let-us-Coding/p/12923241.html