1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<ctype.h> 5 #define NAME 20 6 #define SEX 6 7 typedef struct item{ 8 char *name; 9 char *sex; 10 int age; 11 struct item * front;//前驱,指向上一个结点 12 struct item *rear;//后继,指向下一个结点 13 }ITEM; 14 ITEM * initList(){//返回一个初始化的头结点 15 ITEM * list=(ITEM *)malloc(sizeof(ITEM)); 16 list->front=list->rear=NULL;//头结点初始化时前驱和后继为空 17 return list; 18 } 19 char * GetName(){ 20 char *p=(char *)malloc(sizeof(char)*NAME); 21 printf("请输入名字:"); 22 scanf("%s",p); 23 printf("GetName\n"); 24 return p; 25 } 26 char * GetSex(){ 27 char *p=(char *)malloc(sizeof(char)*SEX); 28 printf("请输入性别:"); 29 scanf("%s",p); 30 printf("GetSex\n"); 31 return p; 32 } 33 int GetAge(){ 34 int age; 35 printf("请输入年龄:"); 36 scanf("%d",&age); 37 printf("GetAge\n"); 38 return age; 39 } 40 void menu(){ 41 printf("键入以下选项来操作,ctrl+z以退出!\nA:添加数据\nB:打印列表\nC:按名插入数据\nD:按名删除数据\nE:按名查找详细信息\n"); 42 } 43 void AddITEM(ITEM *p,char *name,char *sex,int age){ 44 ITEM * item=(ITEM *)malloc(sizeof(ITEM)); 45 ITEM *head=p; 46 item->name=name; 47 item->sex=sex; 48 item->age=age; 49 item->rear=NULL; 50 if(!p->front&&!p->rear){//如果添加的是第一个结点 51 p->rear=item;//头结点的后继指向第一个节点 52 p->front=item;//头结点的前驱指向第一个节点 53 item->front=p;//第一个结点的前驱指向头结点 54 printf("frist!\n"); 55 } 56 else{ 57 head->front->rear=item;//最后一个结点的后继指向新结点 58 item->front=head->front;//新结点前驱指针指向最后一个结点 59 head->front=item;//更新头结点的前驱(总是指向最后一个结点) 60 printf("second!\n"); 61 } 62 printf("姓名:%s 性别:%s 年龄:%d\n",p->rear->name,p->rear->sex,p->rear->age); 63 } 64 void ShowList(ITEM *p){ 65 while(p->rear){ 66 printf("姓名:%s 性别:%s 年龄:%d\n",p->rear->name,p->rear->sex,p->rear->age); 67 p=p->rear; 68 } 69 } 70 void InsertITEM(ITEM *p){ 71 printf("请输入要插入在哪个目标后面:\n"); 72 char *pos=GetName(); 73 ITEM *target=(ITEM *)malloc(sizeof(ITEM));//新结点 74 printf("请输入要插入的信息:\n"); 75 char *target_name=GetName(); 76 char *target_sex=GetSex(); 77 int target_age=GetAge(); 78 printf("c!\n"); 79 target->name=target_name; 80 target->sex=target_sex; 81 target->age=target_age; 82 while(p->rear){ 83 if(strcmp(p->rear->name,pos)==0){//如果匹配结果为p结点的后继结点 84 target->rear=p->rear->rear;//新结点后继指向要插入结点后的后继 85 p->rear->rear=target;//目标位置结点的后继指向新结点 86 target->front=p->rear;//新结点的前驱指向该位置 87 return; 88 } 89 else 90 p=p->rear; 91 } 92 } 93 void DeleITEM(ITEM *p){ 94 printf("请输入要删除的目标姓名:\n"); 95 char *pos=GetName(); 96 while(p->rear){ 97 if(strcmp(p->rear->name,pos)==0){//如果匹配结果为p结点的后继结点 98 if(p->rear->rear!=NULL){//如果要删除的结点不为最后一个结点 99 ITEM *ptr=p->rear->rear;//指向目标结点的后继结点 100 ptr->front=p;//目标结点的后继结点的前驱结点为目标节点的前驱即p 101 free(p->rear); 102 p->rear=ptr;//目标结点的前驱的后继指向目标结点的后继 103 } 104 else{ 105 free(p->rear);//直接释放 106 p->rear=NULL;//指向该结点置为空 107 } 108 } 109 else 110 p=p->rear; 111 } 112 } 113 void ShowSB(ITEM *p){ 114 printf("请输入目标信息:\n"); 115 char *pos=GetName(); 116 while(p->rear){ 117 if(strcmp(p->rear->name,pos)==0){//如果匹配结果为p结点的后继结点 118 printf("姓名:%s 性别:%s 年龄:%d\n",p->rear->name,p->rear->sex,p->rear->age); 119 return; 120 } 121 else 122 p=p->rear; 123 } 124 } 125 void main(){ 126 ITEM *head=initList();//指向头结点 127 char ch; 128 menu(); 129 while((ch=getchar())!=EOF){ 130 setbuf(stdin,NULL); 131 switch (toupper(ch)){ 132 case 'A': AddITEM(head,GetName(),GetSex(),GetAge());break; 133 case 'B': ShowList(head);break; 134 case 'C': InsertITEM(head);break; 135 case 'D': DeleITEM(head);break; 136 case 'E': ShowSB(head);break; 137 } 138 menu(); 139 setbuf(stdin,NULL); 140 } 141 }
数据结构-C语言实现-双向循环链表
猜你喜欢
转载自www.cnblogs.com/Let-us-Coding/p/12932257.html
今日推荐
周排行