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 }