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 }
数据结构-单链表-C语言实现(头插法)
猜你喜欢
转载自www.cnblogs.com/Let-us-Coding/p/12923241.html
今日推荐
周排行