实现一个通讯录;

通讯录可以用来存储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  如果在别的编译器运行,则不需要定义这个宏,

运行结果:

结果就不予展示了,有兴趣的可以复制代码然后运行,

本人也是初学,代码中难免有许多疏漏之处,欢迎各位大神批评指正!