本文实例为大家分享了C语言实现电话簿项目管理的具体代码,供大家参考,具体内容如下
1.前言
在C语言的学习,经常有一个需要完成的项目就是电话簿的管理,在刚学习玩C语言基本内容后,面对这么多的项目需求往往无从下手,本文将一步一步完成电话簿的创建。本文提供一种思路,如有更好的实现欢迎讨论。
2.实现功能
本电话簿需要实现的功能有
实现电话簿的初始创建
实现电话簿的后添加
实现电话簿的删除
实现电话簿的查看(按链表的排序)
实现电话簿的查找(名字以及号码)
实现电话簿的排序(名字以及号码)
3.思路解析
3.1二级目录实现电话簿的初始创建
创建电话簿需要知道要保存什么信息,这是用我们的结构体来创建保存信息
?| 1 2 3 4 5 6 7 8 |
typedef struct phone_book
{
char job[30];//工作信息
char number[20];//电话号码
char name[15];//名字拼音
char email[30];//邮箱信息
struct phone_book* next;//指向下一个节点
}phone_book;
|
由于电话簿没有限定有多大,并且是动态变化的,这时候用数组来保存信息显然不合适,这时候就需要链表来实现。
在电话簿第一次运行时,里面没有任何信息,我们需要来创建电话簿。我们需要三个指针来帮助我们解决问题。 其中一个是链表的头指针,两外两个帮助我们开辟新的节点并指向下一个节点让我们的链表接下去。
| 1 2 3 4 |
phone_book* head, * p1, * p2;
head = NULL;//头指针初始化为空
p1 = (phone_book*)malloc(LEN);
p2 = p1;
|
完成指针的创建我们要输入信息,就是下面这串代码帮我们实现,创建联系人我不想一个一个输入,就用一个循环让它一直跑,直到名字输入0结束。(没有想到其他的好方法来结束欸~)
每输入信息后要往链表里加入,用一个变量记录联系人数量,创建第一个是把它弄到头指针里面去,后面的联系人通过两个指针处理接下去。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
while (1)
{
printf("请输入姓名(姓名为0时停止创建):"); gets_s(p1->name);
if (strcmp(p1->name, "0") == 0) break;
printf("请输入电话号码:"); gets_s(p1->number);
printf("请输入工作单位:"); gets_s(p1->job);
printf("请输入E-mail:"); gets_s(p1->email);
n = n + 1;
if (n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (phone_book*)malloc(LEN);
}p2->next = NULL;
return head;
|
3.2二级目录实现电话簿的后添加
后添加的操作几乎和创建一模一直,只是操作时为了方便把他们加到头指针后面,所以这时候链表的排列并不是按照添加事件的顺序了。(头指针yyds)
3.3二级目录实现电话簿的删除
联系人的删除就有些难以理解了,不过也好理解。找到这个节点后,释放它,在这之前要标记它前一个节点后一个节点,让它俩连接起来。直接上代码。
通过查找我们发现要删除节点p,如果要删除的人正好在第一个,直接把头指针接到后面,如果不是,就让p1和p后面的节点相连,并且释放p
| 1 2 3 4 5 6 7 8 9 10 11 |
phone_book* p = head, * p1;//p1是p的前一个节点
if (p == head)
{
head = p->next;
free(p);
}
else
{
p1->next = p->next;
free(p);
}
|
3.4二级目录实现电话簿的查找
只需要比较信息即可实现,不过分为按名字和号码来实现,这就需要三个小函数来实现看代码即可理解
3.5二级目录实现电话簿的查找
只需要比较信息即可实现,不过分为按名字和号码来实现,这就需要三个小函数来实现看代码即可理解
3.6二级目录实现电话簿的排序
只需要比较信息即可实现,不过分为按名字和号码来实现,这就需要三个小函数来实现看代码即可理解
4.源代码及注释
?| 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 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 |
#define _CRT_SECURE_NO_WARNINGS
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct phone_book
{
char job[30];
char number[20];
char name[15];
char email[30];
struct phone_book* next;
}phone_book;
#define LEN sizeof(phone_book)
phone_book* creat_list()
{
phone_book* head, * p1, * p2;
char name[15];
int n = 0;
head = NULL;
p1 = (phone_book*)malloc(LEN);
p2 = p1;
while (1)
{
printf("请输入姓名(姓名为0时停止创建):"); gets_s(p1->name);
if (strcmp(p1->name, "0") == 0) break;
printf("请输入电话号码:"); gets_s(p1->number);
printf("请输入工作单位:"); gets_s(p1->job);
printf("请输入E-mail:"); gets_s(p1->email);
n = n + 1;
if (n == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (phone_book*)malloc(LEN);
}p2->next = NULL;
return head;
}//链表创建函数
void print_list(phone_book* head)
{
void menu();
int n = 0;
printf("现在通讯录中有如下成员:");
while (head != NULL)
{
printf("\n名字:"); puts(head->name);
printf("\n电话号码:"); puts(head->number);
printf("\n工作单位:"); puts(head->job);
printf("\nE-mail:"); puts(head->email);
putchar('\n');
head = head->next;
n++;
if (n % 8 == 0)
{
printf("按回车键显示下一页");
getchar();
system("cls");
menu();
}
}
printf("总共%d个联系人\n", n);
}
int length(phone_book* head)
{
int n = 0;
phone_book* p;
p = head;
while (p != NULL)
{
p = p->next; n++;
}
return n;
}//判断联系人个数
void sortbynumber(phone_book* head)
{
void menu();
int n = length(head);
int i, j;
phone_book temp, * p;
p = head;
phone_book a[1000];
for (i = 1; i <= n; i++)
{
strcpy(a[i].name, p->name);
strcpy(a[i].number, p->number);
strcpy(a[i].job, p->job);
strcpy(a[i].email, p->email);
p = p->next;
}
for (i = 1; i <= n - 1; i++)
{
for (j = 1; j <= n - i; j++)
{
if (strcmp(a[j].number, a[j + 1].number) > 0)
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
printf("现在通讯录中有如下成员:");
for (i = 1; i <= n; i++)
{
printf("\n名字:"); puts(a[i].name);
printf("\n电话号码:"); puts(a[i].number);
printf("\n工作单位:"); puts(a[i].job);
printf("\nE-mail:"); puts(a[i].email);
putchar('\n');
if (i % 8 == 0)
{
printf("按回车键显示下一页");
getchar();
system("cls");
menu();
}
}
printf("总共%d个联系人\n", n);
}
void sortbyname(phone_book* head)
{
void menu();
int n = length(head);
int i, j;
phone_book temp, * p;
p = head;
phone_book a[100];
for (i = 1; i <= n; i++)
{
strcpy(a[i].name, p->name);
strcpy(a[i].number, p->number);
strcpy(a[i].job, p->job);
strcpy(a[i].email, p->email);
p = p->next;
}
for (i = 1; i <= n - 1; i++)
{
for (j = 1; j <= n - i; j++)
{
if (strcmp(a[j].name, a[j + 1].name) > 0)
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
printf("现在通讯录中有如下成员:");
for (i = 1; i <= n; i++)
{
printf("\n名字:"); puts(a[i].name);
printf("\n电话号码:"); puts(a[i].number);
printf("\n工作单位:"); puts(a[i].job);
printf("\nE-mail:"); puts(a[i].email);
putchar('\n');
if (i % 8 == 0)
{
printf("按回车键显示下一页");
getchar();
system("cls");
menu();
}
}
printf("总共%d个联系人\n", n);
}//排序按照电话号码
void sort_list(phone_book* head)
{
void menu();
if (head == NULL)
{
printf("电话簿为空,请重新创建!");
return;
}
char a;
printf("1,按电话号码升序排序\n2,按姓名字母升序排序\n");
printf("请选择一种排序方法:");
a = getchar();
getchar();
switch (a)
{
case'1':sortbynumber(head); break;
case'2':sortbyname(head); break;
default:printf("输入有误!\n"); break;
}
}
void findbyname(phone_book* head)
{
if (head == NULL)
{
printf("电话簿为空,请重新创建"); return;
}
char name[15]; printf("请输入名字:");
gets_s(name);
while (strcmp(name, head->name) != 0)
{
head = head->next;
if (head == NULL)
{
printf("电话簿未有此联系人\n");
return;
}
}
printf("%s的电话号码为:", name);
puts(head->number);
printf("\n工作单位:");
puts(head->job);
printf("\nE-mail:");
puts(head->email);
}
void findbynumber(phone_book* head)
{
if (head == NULL)
{
printf("电话簿为空,请重新创建");
return;
}
char number[20];
printf("请输入电话号码:");
gets_s(number);
while (strcmp(number, head->number) != 0)
{
head = head->next;
if (head == NULL)
{
printf("电话簿未有此联系人\n");
return;
}
}
printf("%s的主人为:", number);
puts(head->name);
printf("\n工作单位:");
puts(head->job);
printf("\nE-mail:");
puts(head->email);
}
void find(phone_book* head)
{
int n;
printf(" 1,通过名字查找\n 2,通过电话号码查找\n 3,退出\n请选择你需要的服务:");
scanf("%d", &n);
getchar();
while (1)
{
if (n == 1)
{
findbyname(head);
printf("请选择服务项:");
scanf("%d", &n);
getchar();
}
if (n == 2)
{
findbynumber(head);
printf("请选择服务项:");
scanf("%d", &n);
getchar();
}
if (n == 3)
return;
else
{
printf("输入不正确!");
printf("请选择服务项:");
scanf("%d", &n);
getchar();
}
}
}//查找联系人
void add_list(phone_book* head)
{
phone_book* p1, * p2, * h;
h = NULL;
char name[15];
p1 = (phone_book*)malloc(LEN);
p2 = p1;
int n = 0;
while (1)
{
printf("请输入名字(名字为0时停止)"); gets_s(p1->name);
if (strcmp(p1->name, "0") == 0)break;
printf("请输入电话号码:"); gets_s(p1->number);
printf("请输入工作单位:"); gets_s(p1->job);
printf("请输入E-mail:"); gets_s(p1->email);
n = n + 1;
if (n == 1)
h = p1;
else
p2->next = p1;
p2 = p1;
p1 = (phone_book*)malloc(LEN);
}
p1 = head->next;
head->next = h;
p2->next = p1;
}//添加链表函数
phone_book* delete_list(phone_book* head)
{
char a[20];
printf("请输入联系人名字或电话:");
gets_s(a);
if (head == NULL)
{
printf("电话簿为空,请重新创建"); return head;
}
phone_book* p = head, * p1;
p1 = NULL;
while (strcmp(a, p->name) != 0 && strcmp(a, p->number) != 0)
{
p1 = p;
p = p->next;
if (p == NULL)
{
printf("电话簿未有此联系人\n");
return head;
}
}
printf("查找到了!");
printf("\n名字:"); puts(p->name);
printf("\n电话号码:"); puts(p->number);
printf("\n工作单位:"); puts(p->job);
printf("\nE-mail:"); puts(p->email);
putchar('\n'); char b[10]; printf("是否删除该联系人(Y/N)");
gets_s(b);
if (strcmp(b, "y") == 0 || strcmp(b, "Y") == 0)
{
if (p == head)
{
head = p->next;
free(p);
}
else
{
p1->next = p->next; free(p);
}
printf("成功删除!");
}
else if (strcmp(b, "n") == 0 || strcmp(b, "N") == 0)
printf("取消删除!");
else
printf("输入错误!");
return head;
}//删除链表函数
void save_list(phone_book* head)
{
FILE* fp;
if ((fp = fopen("dianhuabu.dat", "wb")) == NULL)
{
printf("File cannot be opened\n");
exit(0);
}
if (head == NULL)
{
printf("通讯录为空\n");
return;
}
phone_book* p1 = head;
while (p1 != NULL)
{
if (fwrite(p1, LEN, 1, fp) != 1)
{
printf("cannot open file\n");
return;
}
p1 = p1->next;
}
printf("保存完毕!\n"); fclose(fp);
}//文件写入函数
phone_book* load_list(phone_book* head)
{
FILE* fp;
if ((fp = fopen("dianhuabu.dat", "rb")) == NULL)
{
printf("电话簿为空,请重新创建\n");
exit(0);
}phone_book* p1, * p2;
p1 = (phone_book*)malloc(LEN);
if (fread(p1, LEN, 1, fp) == 0)
{
printf("电话簿为空,请重新创建");
return head;
}
head = p1;
p2 = p1; p1 = (phone_book*)malloc(LEN);
while (fread(p1, LEN, 1, fp))
{
p2->next = p1;
p2 = p1;
p1 = (phone_book*)malloc(LEN);
}
p2->next = NULL;
free(p1);
return(head);
fclose(fp);
}//文件读取函数
void menu()
{
printf(" 欢迎进入电话簿系统 \n");
printf("********************************************\n");
printf(" 1、创建电话簿(会将原有电话簿覆盖)\n");
printf(" 2、查找联系人 \n");
printf(" 3、添加联系人 \n");
printf(" 4、删除联系人 \n");
printf(" 5、显示联系人 \n");
printf(" 6、查看电话簿(排序) \n");
printf(" 7、退出系统 \n");
printf("********************************************\n");
}//菜单界面
void main()
{
system("cls");
menu();//进入菜单界面
printf(" 请选择你所需要的服务:");
int n;
scanf("%d", &n);
getchar();
phone_book* head;
head = NULL;
while (1)
{
system("cls");
menu();
switch (n)
{
case 1:
{
head = creat_list();
system("cls");
menu();
print_list(head);
save_list(head);
printf("********************************************\n");
printf("\n如需要其他服务,请重新输入:");
scanf("%d", &n); getchar(); }break;//创建电话簿(创建链表、写入文件,释放链表)
case 2:
{
head = load_list(head);
find(head);
printf("********************************************\n");
printf("\n如需要其他服务,请重新输入:");
scanf("%d", &n); getchar(); }break;//查找联系人(读入文件、查找函数、释放链表)
case 3:
{
head = load_list(head);
add_list(head);
system("cls");
menu();
save_list(head);
printf("********************************************\n");
printf("\n如需要其他服务,请重新输入:");
scanf("%d", &n); getchar(); }break;//添加联系人(读入文件、添加链表、写入文件、释放链表)
case 4:
{
head = load_list(head);
head = delete_list(head);
save_list(head);
printf("********************************************\n");
printf("\n如需要其他服务,请重新输入:");
scanf("%d", &n);
getchar(); }break;//删除联系人(读入文件,删除链表、写入文件、释放链表)
case 5:
{
head = load_list(head);
print_list(head);
save_list(head);
}
case 6:
{
head = load_list(head);
sort_list(head);
printf("********************************************\n");
printf("\n如需要其他服务,请重新输入:");
scanf("%d", &n); getchar(); }break;//查看电话簿(读入文件,排序链表、释放链表)
case 7:
{ system("cls"); return; }break;//退出
default:
{
printf("\n输入有误,请重新输入:");
scanf("%d", &n);
getchar();
}break;
}
}
}
|
5结束语
以上就是电话簿管理完全过程,欢迎探讨。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/wang_fm/article/details/119081429








发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。