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 }