通讯录管理系统.docx
《通讯录管理系统.docx》由会员分享,可在线阅读,更多相关《通讯录管理系统.docx(21页珍藏版)》请在冰豆网上搜索。
通讯录管理系统
洛阳理工学院
课程设计报告
课程名称数据结构课程设计
设计题目通讯录管理系统
课程设计任务书
设计题目:
通讯录管理系统
设计内容与要求:
该系统至少应具有如下功能:
1.输入记录要求随时都能使用该项功能实现记录的输入,一次可以输入一条记录,也可以输入多条记录。
2.输出
(1)按自然顺序输出
(2)按某种排序顺序输出。
至少两种。
3.查询至少提供两种查询方式。
4.修改至少提供两种修改方式。
5.删除既能一次删除一条记录,也能一次删除多条记录。
6.退出通讯录管理结束后,正常退出系统。
要求:
1.每个记录至少包含如下信息:
姓名、电话、所在城市、所在单位、年龄、E-mail、备注等。
2.以采单方式实现功能选择控制。
3.编写功能独立的函数实现各功能。
4.记录最大个数100。
课程设计评语
成绩:
指导教师:
_______________
年月日
一.数据结构
typedefstruct//通讯录结点类型
{
charnum[10];//编号
charname[10];//姓名
charsex[5];//性别
charphone[20];//电话
charadd[30];//地址
}DataType;
typedefstructnode//结点定义
{
DataTypedata;//结点数据
structnode*next;//结点指针域
}ListNode;
typedefListNode*LinkList;
二.系统总框架图
算法流程图:
如下
图1程序算法流程图
三.详细设计
(1)主函数:
voidmain()
(2)LinkListCreateList(void)//创建函数
(3)intmenu_select()/*菜单函数*/
(4)voidInsertNode(LinkListhead,ListNode*p)//插入函数。
(5)ListNode*ListFind(LinkListhead)//查找函数
(6)voidsort(LinkListhead)//排序函数
(7)voidPrintList(LinkListhead)//输出函数
四.测试数据
运行程序:
建立
输出和排序如下:
查询如下
插入如下:
五.源程序
#include
#include
#include
typedefstruct//通讯录结点类型
{
charnum[10];//编号
charname[10];//姓名
charsex[5];//性别
charphone[20];//电话
charadd[30];//地址
}DataType;
typedefstructnode//结点定义
{
DataTypedata;//结点数据
structnode*next;//结点指针域
}ListNode;
typedefListNode*LinkList;
LinkListhead;
ListNode*p;
//函数说明
intmenu_select();//声明菜单函数
LinkListCreateList(void);//声明创建函数
voidInsertNode(LinkListhead,ListNode*p);//插入函数声明
ListNode*ListFind(LinkListhead);//声明查找函数
voidDelNode(LinkListhead);//删除函数声明
voidPrintList(LinkListhead);//输出函数声明
voidsort(LinkListhead);//排序函数说明
voidsort_sort(LinkListp,LinkListq);
//主函数
voidmain()
{
for(;;)
{
switch(menu_select())
{
case1:
printf("********************\n");
printf("*通讯录的建立*\n");
printf("********************\n");
head=CreateList();
break;
case2:
printf("********************\n");
printf("*通讯录信息的添加*\n");
printf("********************\n");
printf("编号姓名性别电话地址\n");
printf("********************\n");
p=(ListNode*)malloc(sizeof(ListNode));//申请新结点
scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.add);
InsertNode(head,p);
break;
case3:
printf("********************\n");
printf("*通讯录信息的查询*\n");
printf("********************\n");
p=ListFind(head);
if(p!
=NULL)
{
printf("编号姓名性别联系电话地址\n");
printf("--------------------------------\n");
printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.add);
printf("--------------------------------\n");
}
else
printf("没有到要查询的通讯者!
\n");
break;
case4:
printf("********************\n");
printf("*通讯录信息的删除*\n");
printf("********************\n");
p=ListFind(head);
DelNode(p);//删除结点
break;
case5:
printf("********************\n");
printf("*通讯录信息的输出*\n");
printf("********************\n");
PrintList(head);
printf("***************************************\n");
sort(head);
break;
case0:
printf("\t再见!
\n");
return;
}
}
}
//菜单
intmenu_select()
{
intsn;
printf("通讯录管理系统\n");
printf("============\n");
printf("1.通讯录的建立\n");
printf("2.通讯录的插入\n");
printf("3.通讯录的查询\n");
printf("4.通讯录的删除\n");
printf("5.通讯录的输出\n");
printf("0.退出管理系统\n");
for(;;)
{
scanf("%d",&sn);
if(sn<0||sn>5)
printf("\n\t输入有误,请重新输入\n");
else
break;
}
returnsn;
}
//建立
LinkListCreateList()
{//用尾插法建立带头结点的通讯录的算法
LinkListhead=(ListNode*)malloc(sizeof(ListNode));
ListNode*p,*rear;
intflag=0;
rear=head;
while(flag==0)
{
p=(ListNode*)malloc(sizeof(ListNode));
printf("编号姓名性别电话地址\n");
printf("-------------------------------------------\n");
scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.add);
rear->next=p;
rear=p;
printf("是否结束建立表?
(1/0)\n");
scanf("%d",&flag);
}
rear->next=NULL;
returnhead;
}
//插入
voidInsertNode(LinkListhead,ListNode*p)
{
ListNode*p1,*p2;
p1=head;
p2=p1->next;
while(p2!
=NULL&&strcmp(p2->data.num,p->data.num)<0)
{
p1=p2;
p2=p2->next;
}
p1->next=p;
p->next=p2;
}
//查找
ListNode*ListFind(LinkListhead)
{
ListNode*p;
charnum[10];
charname[10];
intm;
printf("========\n");
printf("1.按编号查询\n");
printf("2.按姓名查询\n");
printf("========\n");
printf("请选择:
");
p=head->next;//假定通讯录表带头结点
scanf("%d",&m);
if(m==1)
{
printf("请输入要查找者的编号:
");
scanf("%s",num);
while(p&&strcmp(p->data.num,num)!
=0)
p=p->next;
if(p==NULL||strcmp(p->data.num,num)>0)
p=NULL;//没有要查找的人
}
else
if(m==2)
{
printf("请输入要查找人的姓名:
");
scanf("%s",name);
while(p&&strcmp(p->data.name,name)!
=0)
p=p->next;
}
returnp;
}
//删除
voidDelNode(LinkListp)
{
ListNode*q;
//p=ListFind(head);//调用查找函数
if(p==NULL)
{
printf("没有查到要删除的人!
\n");
return;
}
q=head;
while(q!
=NULL&&q->next!
=p)
q=q->next;
q->next=p->next;
free(p);
printf("通讯录已经删除!
\n");
}
//输出
voidPrintList(LinkListhead)
{
ListNode*p;
p=head->next;
printf("编号姓名性别电话地址\n");
printf("-------------------------\n");
while(p!
=NULL)
{
printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.sex,p->data.phone,p->data.add);
printf("-----------------------\n");
p=p->next;
}
}
//快速排序,小的数据往前排,后的数据往后排
voidsort(LinkListhead)
{
//LinkListtemp,temp_change;
LinkListp=head->next;
LinkListq=p;
if(q==NULL)
{
printf("里面没有数据");
return;
}
if(q->next==NULL)
{
printf("里面只有一个数据:
");
printf("%s,%s,%s,%s,%s\n",q->data.num,q->data.name,q->data.sex,q->data.phone,q->data.add);
return;
}
while(q!
=NULL)
{
while(p)
{
if(strcmp(p->data.name,q->data.name)<0)
{
p=p->next;
}
else
{
//temp_change=p;
//p=q;
//q=temp_change;
sort_sort(q,p);
p=p->next;
}
}
printf("%s,%s,%s,%s,%s\n",q->data.num,q->data.name,q->data.sex,q->data.phone,q->data.add);
printf("-----------------------\n");
q=q->next;
p=q;
}
}
voidsort_sort(LinkListp,LinkListq)
{
charnum[10];//编号
charname[10];//姓名
charsex[5];//性别
charphone[20];//电话
charadd[30];//地址
strcpy(num,q->data.num);
strcpy(q->data.num,p->data.num);
strcpy(p->data.num,num);
strcpy(name,q->data.name);
strcpy(q->data.name,p->data.name);
strcpy(p->data.name,name);
strcpy(sex,q->data.sex);
strcpy(q->data.sex,p->data.sex);
strcpy(p->data.sex,sex);
strcpy(phone,q->data.phone);
strcpy(q->data.phone,p->data.phone);
strcpy(p->data.phone,phone);
strcpy(add,q->data.add);
strcpy(q->data.add,p->data.add);
strcpy(p->data.add,add);
}