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