实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1.添加联系人信息
2.删除指定联系人信息
3.查找指定联系人信息
4.修改指定联系人信息
5.显示所有联系人信息
6.清空所有联系人
7.以名字排序所有联系人
由于一般储存都使用不了1000个人的信息,故为了省空间我使用的是单链表储存联系人的信息,有一个储存一个,单链表具有省空间的作用,我将函数代码封装,下边我将分布列出来
定义结构体头文件
#ifndef __telphone_H__#define _CRT_SECURE_NO_WARNINGS 1#define __telphone_H__#include#include #include typedef struct tel_number{ char name[8]; int sex; int age; char tel[12]; char address[20]; struct tel_number *next;}Node, *Telphone;#define TRUE 1#define FALSE 0extern void Init_tel(Telphone *S); //联系人链表初始化extern char *fun_sb(char name[]); //输入指定联系人extern int Add_tel(Telphone S); //增加联系人extern void Show_tel(Telphone S); //显示所有联系人extern int Delete_tel(Telphone S, char name[]); //删除制定联系人extern int fund_tel(Telphone S, char name[]); //寻找指定联系人extern int Mod_tel(Telphone S, char name[]); //修改指定联系人extern void Empty_tel(Telphone S); //清空联系人extern int Sort_tel(Telphone S); //按姓名排序extern void menu(); //菜单#endif
主函数文件
#include"telphone.h"int main(){ int let = 0; Telphone S; Init_tel(&S); char name[10]; int n = 1; while (n) { system("cls"); menu(); scanf("%d", &n); switch (n) { case 1: let = Add_tel(S); if (let == 1) printf("输入成功!\n"); else printf("输入失败!\n"); system("pause"); break; case 2: let = Delete_tel(S, fun_sb(name)); if (let == 1) printf("成功删除该指定联系人!\n"); else printf("删除失败!\n"); system("pause"); break; case 3: let = fund_tel(S, fun_sb(name)); if (let == 0) printf("未找到该指定联系人"); system("pause"); break; case 4: let = Mod_tel(S, fun_sb(name)); if (let == 1) printf("成功修改该指定联系人!\n"); else printf("修改失败!\n"); system("pause"); break; case 5: Show_tel(S); printf("已全部显示!\n"); system("pause"); break; case 6: Empty_tel(S); printf("\t清除成功!\n"); system("pause"); break; case 7: let=Sort_tel(S); if (let == 1) printf("成功将联系人按姓名排序!\n"); else printf("排序失败!\n"); system("pause"); break; case 8: printf("\n\t\t\t\t谢谢使用!\n"); n = 0; break; default: printf("\a\t\t输入序号有误!请重新输入!!!\n"); system("pause"); break; } } system("pause"); return 0;}
联系人链表初始化
#include"telphone.h"//电话簿初始化void Init_tel(Telphone *S){ *S = (Telphone)malloc(sizeof(Node)); (*S)->next = NULL;}
输入指定联系人
#include"telphone.h"//输入联系人char *fun_sb(char name[]){ getchar(); printf("请输入指定联系人:"); gets(name); return name;}
增加联系人
int Add_tel(Telphone S)//链栈进栈{ Node *temp; temp = (Node *)malloc(sizeof(Node)); if (temp == NULL) return(FALSE); /* 申请空间失败 */ char name[10]; char address[20]; char c = 1; int i = 0, j = 0; getchar(); printf("请输入姓名:"); gets(name); printf("请输入性别:男->1,女->0 :"); scanf("%d", &(temp->sex)); strcpy(temp->name, name); printf("请输入年龄:"); scanf("%d", &(temp->age)); getchar(); printf("请输入住址:"); gets(address); printf("请输入电话号码:"); gets(temp->tel); strcpy(temp->address, address); temp->next = S->next; S->next = temp; /* 修改当前栈顶指针 */ return(TRUE);}
显示所有联系人
#include"telphone.h"void Show_tel(Telphone S) //显示所有联系人{ int i = 0; Node * temp = S->next; if (temp == NULL) return; printf("姓名:%s\n", temp->name); printf("性别:"); if (1 == (temp->sex)) printf("男\n"); else printf("女\n"); printf("年龄:%d\n", temp->age); printf("电话号码:%s\n", temp->tel); printf("住址:%s\n\n", temp->address); Show_tel(S->next);}
删除指定联系人
#include"telphone.h"//删除指定联系人int Delete_tel(Telphone S, char name[]){ Node * temp; if (S->next == NULL) return FALSE; else { temp = S->next; if (strcmp(temp->name, name) == 0) { S->next = temp->next; return TRUE; } else Delete_tel(S->next, name); } return FALSE;}
寻找指定联系人
#include"telphone.h"//寻找指定联系人int fund_tel(Telphone S, char name[]){ int i = 0; Node* temp; if (S->next == NULL) return FALSE; else { temp = S->next; if (strcmp(temp->name, name) == 0) { printf("找到指定联系人! 信息如下:\n"); printf("姓名:%s\n", temp->name); printf("性别:"); if (1 == (temp->sex)) printf("男\n"); else printf("女\n"); printf("年龄:%d\n", temp->age); printf("电话号码:%s\n", temp->tel); printf("住址:%s\n", temp->address); return TRUE; } else fund_tel(S->next, name); } return FALSE;}
修改指定联系人
#include"telphone.h"//修改制定联系人int Mod_tel(Telphone S, char name[]){ int i = 0; Node *temp; if (S->next == NULL) return FALSE; else { temp = S->next; if (strcmp(temp->name, name) == 0) { printf("找到指定联系人!请修改!\n :"); printf("姓名由%s修改为:", temp->name); gets(name); printf("请输入性别:男->1,女->0 :"); scanf("%d", &(temp->sex)); strcpy(temp->name, name); printf("年龄由%d修改为:", temp->age); scanf("%d", &(temp->age)); getchar(); printf("住址由%s修改为:", temp->address); gets(temp->address); printf("电话号码由%s修改为:", temp->tel); gets(temp->tel); return TRUE; } else Mod_tel(S->next, name); } return ;}
清空联系人
#include"telphone.h"//清空void Empty_tel(Telphone S){ if (S->next != NULL) free(S); S->next = NULL;}
按姓名排序
#include"telphone.h"//按姓名排序int Sort_tel(Telphone S){ if (S->next = NULL) return FALSE; int flag = 0; Node *p3 = S; Node *p2, *p1, *p4, *p5; while (p3->next->next != NULL)//注意链表向前推进的方式 { p2 = p3->next; p5 = p2; p1 = p2; p4 = p1; while (p1->next != NULL)//内存循环终止的条件 { if (strcmp(p5->name, p1->next->name)>0)//找出原链表中剩余节点中值最小的那个节点 { p5 = p1->next; p4 = p1; flag = TRUE; } p1 = p1->next; } if (flag)//交换两个节点的顺序,值小的节点往前调 { if (p2 == p4)//此种情况为要交换顺序的两个节点相邻 { p2->next = p5->next; p5->next = p2; p3->next = p5; } else//这种情况为要交换的两个节点不相邻 { Node *temp = p5->next; p5->next = p2->next; p3->next = p5; p4->next = p2; p2->next = temp; } } p3 = p3->next; } return TRUE;}
注:本人使用的是VS2013编译器,为了使用scanf,故定义了宏 #define _CRT_SECURE_NO_WARNINGS 1 如果在别的编译器运行,则不需要定义这个宏,
运行结果:
结果就不予展示了,有兴趣的可以复制代码然后运行,
本人也是初学,代码中难免有许多疏漏之处,欢迎各位大神批评指正!