您的位置:首页 > 其它

设计实现一个简易通讯录,要求使用结构体

2015-11-28 22:50 731 查看
实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址

提供方法:
1.添加联系人信息
2.删除指定联系人信息
3.查找指定联系人信息
4.修改指定联系人信息
5.显示所有联系人信息
6.清空所有联系人
7.以名字排序所有联系人

由于一般储存都使用不了1000个人的信息,故为了省空间我使用的是单链表储存联系人的信息,有一个储存一个,单链表具有省空间的作用,我将函数代码封装,下边我将分布列出来

定义结构体头文件
#ifndef __telphone_H__

#define _CRT_SECURE_NO_WARNINGS 1

#define __telphone_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

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 0

extern 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 如果在别的编译器运行,则不需要定义这个宏,

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

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

本文出自 “分享中进步” 博客,请务必保留此出处http://xmwen1.blog.51cto.com/10730069/1717827
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: