C语言实现个人通讯录管理系统

时间:2022-05-30 07:26:42

如何用c语言制作简易的个人通讯录管理系统?想必这是每一位初步学习c语言的同学需要解决的一个大问题。如何将这些数据类型不完全相同的数据元素存储并访问呢?采用结构体便能轻松解决这个问题!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
struct stu //第一部分:声明结构体类型struct stu
{
 char name[100];//姓名为字符串型
 int xh;//学号为整形
 int grade;//年级
 char cel[15];//手机
 char tel[50];//电话
 char mail[50];//邮件
 char add[100];//地址为字符串型
 char post[15];//邮编
 struct stu *next;//用指针处理链表,next是指针变量,指向结构体变量
};
struct stu *charu(struct stu *head,struct stu *q)//第二部分:插入函数(插入新结点)
{
 struct stu *p;
 for(p=head;p->next!=NULL;p=p->next);//for(使p也指向head;当p为空文件时 ;p指向下一个结点)
 p->next=q;
 q->next=NULL;
 return head;
}
void search(struct stu *head) //第三部分:查找结点并输出
{
 struct stu *p;
 int a;//要查找学生的学号
 if(head->next==NULL)//头文件为空时打印出的结果为"通讯录为空"
 printf("**********************************通讯录为空!!!*********************************\n\n\n");
 else//头文件不为空时,开始查询学生的信息
 {
 printf("\t输入要查询学生学号:");
 scanf("%d",&a);
 for(p=head->next;p->next!=NULL;p=p->next)//for(使p也指向head;当p为空文件时 ;p指向下一个结点)
 {
 if(p->xh==a) //如果输入的学号和某个相同,输出以下的东西。
 {
 printf(" 要查找的学生信息为:\n");
 printf("  ★姓名:");puts(p->name);
 printf("\t学号: ");printf("%d",p->xh);
 printf("\t年级:");printf("%d\n",p->grade);
 printf("\t手机:");puts(p->cel);
 printf("\t电话:");puts(p->tel);
 printf("\t邮箱:");puts(p->mail);
 printf("\t地址");puts(p->add);
 printf("\t邮编:");puts(p->post);
 printf("\t查找成功!!!");
 printf("\n\n\n");
 break;
 }
 }
 if(p->xh==a)
 {
 printf(" 要查找的学生信息为:\n");
 printf("  ★姓名:");puts(p->name);
 printf("\t年级:");printf("%d\n",p->grade);
 printf("\t手机:");puts(p->cel);
 printf("\t电话:");puts(p->tel);
 printf("\t邮箱:");puts(p->mail);
 printf("\t地址");puts(p->add);
 printf("\t邮编:");puts(p->post);
 printf("\t查找成功!!!");
 printf("\n\n\n");
 }
 else printf("no people have found!!!\n");//如果不符合,就输出没有找到
 }
}
struct stu *del(struct stu *head) //第四部分:删除结点
{
 struct stu *p,*q;
 int a;//要删除学生的学号
 if(head->next==NULL)// 头文件为空时,输出通讯录为空
 printf("**********************************通讯录为空!!!*********************************\n\n\n");
 else
 {
 printf("\t输入要删除学生学号:");
 scanf("%d",&a);
 for(p=head,q=p->next;q->xh!=a&&q->next!=NULL;)
 {
 p=p->next;
 q=p->next;
 }
 if(q->xh==a)
 {
 p->next=q->next;
 free(q);//释放q,也就是删除q,在这里就是删除q(学号为a)
 printf("删除成功!!!\n");
 }
 else printf("no people have found!!!");//如果不符合,就输出没有找到
 }
 return head;//返回头文件
}
struct stu *change(struct stu *head) //第五部分:修改结点内容
{
 int b,a,c;
 struct stu *p;
 if(head->next==NULL)// 头文件为空时,输出通讯录为空
 printf("**********************************通讯录为空!!!*********************************\n\n\n");
 else
 {
 printf(" 输入要修改学生学号:");
 scanf("%d",&a);
 for(p=head->next;p!=NULL;p=p->next)
 {
 start:printf("  输入想要修改什么?\n");
 printf("\t\t\t 1:修改姓名\n");
 printf("\t\t\t 2:修改学号\n");
 printf("\t\t\t 3:修改年级\n");
 printf("\t\t\t 4:手机\n");
 printf("\t\t\t 5:电话\n");
 printf("\t\t\t 6:邮件\n");
 printf("\t\t\t 7:地址\n");
 printf("\t\t\t 8:邮编\n");
 printf("   请输入你的选择:");
 scanf("%d",&b);
 switch(b)//先通过学号找到该学生,然后用switch语句选择修改项,再用switch和goto语句实现是否循环
 {
  case 1:
  printf("\t输入新姓名:");
  scanf("%s",p->name);break;
  case 2:printf("\t输入新学号:");
  scanf("%d",&p->xh);break;
  case 3:
  printf("\t输入新的年级:");
  scanf("%d",&p->grade);break;
  case 4:
  printf("\t输入新的手机号:");
  scanf("%s",p->cel);break;
  case 5:
  printf("\t输入新的电话号:");
  scanf("%s",p->tel);break;
  case 6:
  printf("\t输入新的邮箱:");
  scanf("%s",p->mail);break;
  case 7:
  printf("\t输入新的地址:");
  scanf("%s",p->add);break;
  case 8:
  printf("\t输入新的邮编;");
  scanf("%s",p->post);break;
  default: printf("输入操作错误,请重新输入:");
 }
 printf("修改成功!!!\n");
 printf(" 是否要修改其他项? 1:是 2:否\n");
 printf("  请输入你的选择:");
  scanf("%d",&c);
 switch(c) //goto语句实现是否循环
 {
  case 1:goto start;
  case 2:break;
 }
 }
 }
 return head; //返回头文件
}
void printall(struct stu *head) //第六部分:输出全部通讯录
{
 struct stu *p=head->next;
 while(1)
 {
 if(p==NULL)
 {
 printf("**********************************通讯录为空!!!*********************************\n\n\n");
 break;
 }
 else if(p->next==NULL)
 {
 printf("  ★姓名:");puts(p->name);
 printf("\t学号:");printf("%d\n",p->xh);
 printf("\t年级:");printf("%d\n",p->grade);
 printf("\t手机:");puts(p->cel);
 printf("\t电话:");puts(p->tel);
 printf("\t邮箱:");puts(p->mail);
 printf("\t地址:");puts(p->add);
 printf("\t邮编:");puts(p->post);
 printf("输出成功!!!\n");
 printf("\n\n\n");
 break;
 }
 else
 {
 printf("  ★姓名:");puts(p->name);
 printf("\t学号:");printf("%d\n",p->xh);
 printf("\t年级:");printf("%d\n",p->grade);
 printf("\t手机:");puts(p->cel);
 printf("\t电话:");puts(p->tel);
 printf("\t邮箱:");puts(p->mail);
 printf("\t地址:");puts(p->add);
 printf("\t邮编:");puts(p->post);
 printf("\n");
 p=p->next;
 continue;
 }
 printf("输出成功!!!\n");
 }
}
void sf(struct stu *head) //第八部分:释放结点退出系统
{
 struct stu *p=head ;
 printf("释放链表:\n");
 while(p!=NULL)
 {
 head=head->next;
 free(p);
 p=head;
 }
 printf("释放链表成功!!!\n");
}
int main()// 第九部分:主函数框架
{
 int cz;//操作符
 struct stu *head,*q;
 head=(struct stu*)malloc(sizeof(struct stu));//动态链表malloc
 head->next=NULL;//使next指向下一个结点,next结点不放其他结点地址
 system("color 1e");//修改dos窗口前背景色,用两个十六进制数表示
 printf("班级: 姓名: 学号: 设计课题:个人通讯录管理系统\n");
 printf("\n********************************C语言课程设计***********************************\n");
 printf(" *******************★个人通讯录管理系统★*****************\n\n\n");
 printf(" * 1:新建通讯录 *\n");
 printf(" * 2:删除通讯录 *\n");
 printf(" * 3:修改通讯录 *\n");
 printf(" * 4:查询通讯录 *\n");
 printf(" * 5:显示全部记录 *\n");
 printf(" * 6:释放链表并结束程序 *\n");
 printf(" *********************************************************\n");
start :printf("输入操作符1-6:");//"输入操作符1-
 scanf("%d",&cz);
 switch(cz)//switch语句
 {
 case 1:
 q=(struct stu *)malloc(sizeof(struct stu));
 printf("\t输入姓名:");scanf("%s",q->name);
 printf("\t输入学号:");scanf("%d",&q->xh);
 printf("\t输入年级:");scanf("%d",&q->grade);
 printf("\t手机号:");scanf("%s",q->cel);
 printf("\t家庭电话:");scanf("%s",q->tel);
 printf("\t输入电子邮件:");scanf("%s",q->mail);
 printf("\t通讯录地址:");scanf("%s",&q->add);
 printf("\t输入邮编:");scanf("%s",&q->post);
 charu(head,q);
 printf("插入成功!!!\n");break;
 case 2://删除
 head=del(head);break;
 case 3:
 change(head);break;//修改学生信息
  case 4:
 search(head);break;//查找结点head
 case 5:
 printall(head);break; //保存文件
 case 6: //释放结点退出系统
 sf(head);
 exit (0);
 default: printf("输入操作错误,重新"); //什么也不符合就"输入操作错误,重新"
 }
 goto start;//用goto语句实现循环操作
 return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qq_40632256/article/details/83928571