C语言:课程设计《通讯录管理系统》
操作系统为 Win 10,设计环境 Visual Studio 2019
目录
前言
本文仅供学习交流,未经允许请勿转载。
一、需求分析
实现简单的通讯录信息管理,系统要求以菜单方式工作,因而根据题目要求,提供键盘式选择菜单实现功能选择,通讯录信息包括编号、姓名、年龄、性别、手机号等。通讯录信息采用链表保存,提供节点的输入、输出、查询、修改等操作;要实现通讯录信息的查询,则要提供查找功能(包括按编号查询、姓名查询和手机号查询三种查询方式);要实现通讯录信息的删除、修改、清空,则要提供节点的删除 、修改功能。
1.系统以菜单方式工作。
2.通讯录信息录入功能。
3.通讯录信息浏览功能 。
4.通讯录信息查询功能。
5.通讯录信息删除功能。
6.通讯录修改功能。
7.通讯录联系人排序功能。
8.通讯录清空功能。
二、总体设计
根据上面的需求分析,可以将这个系统设计分为以下模块:新建联系人模块、遍历模块、查询模块、定向删除模块、修改模块、排序模块、清空模块。
下面为本次通讯录管理系统的程序框图,如下图所示。
三、详细设计
主要思想:
根据动态链表的特性来实现联系人的“增删改销”,从主菜单分支出来不同的功能,结构体中统一使用字符串方便后续调用大量数据保持格式正确。
在定向删除模块中,通过对节点的头地址和尾地址的修改实现节点的删除(清空模块亦如此)。
在排序模块中,因为直接使用链表排序难度很大,因此选择将节点放入相同结构的数组里面,改变不同节点的数组下标,然后调用数组的方式实现排序输出。
在查询模块中,主要是调用节点数据,然后与输入值比较(不相同就换下一个节点比较直到数据相同,返还对应节点的地址),最后打印出来。
在修改模块中,比较简单,依靠查询模块找到指定联系人的节点然后直接修改。
1,数据信息
编码、姓名、年龄、性别、电话、住址。
建立通讯录结构体,结构体成员包括:编号(唯一性且不可修改)、姓名、年龄、性别、电话、住址。
typedef struct Node
{
int id;//编号
char name[20];//姓名
char age[20];//年龄
char sex[20];//性别
char phone[20];//手机号
char address[20];//住址
struct Node* pNext;
}Node;
2,模块设计
新建联系人模块:输入联系人的姓名、性别、手机号以及其它的一些通讯的相关信息,通过void AddNodeList()函数来实现。
遍历模块:浏览所有联系人的相关信息,通过自己定义的void ScanList()函数与void print(Node* pTemp)函数来实现。
查询模块:可以按联系人姓名、编号、手机号来查询联系人的相关信息,通过自己定义的void Select()函数、Node* SelectNode1(char xm[20])函数 、Node* SelectNode2(int id)函数、Node* SelectNode3(char phone[20])函数来实现。
定向删除模块:输入姓名来定位所要删除的节点地址,并完成节点的删除,通过自己定义的 void DeleteListRand() 函数,void DeleteListHead()函数,void DeleteListTail()和 Node* SelectNode1(char xm[20])函数 、Node* SelectNode2(int id)函数、Node* SelectNode3(char phone[20])函数来实现。
排序模块:选择以年龄、编号、姓名、手机号来进行通讯录排序,通过自己定义void SortList()函数来实现。
清空模块:清空所有的通讯录信息,通过自己定义的void FreeList()函数来实现。
修改模块:通过姓名或者手机号锁定指定联系人,再选择下一项信息。通过自己定义的void change()函数来实现。
1)新建联系人模块
根据数据结构定义,按顺序输入新节点的相关值,通过调整每个节点的首尾指针地址,实现那动态链表。
void AddNodeList()
{
//创建一个节点
Node* pTemp = (Node*)malloc(LEN);
//节点数据赋值
printf("编号为%d\n", idnumber);
pTemp->id = idnumber;
printf("请输入姓名:");
scanf("%s", pTemp->name);
printf("\n");
printf("请输入年龄:");
scanf("%s", pTemp->age);
printf("\n");
printf("请输入性别:");
scanf("%s&