数据结构课程实践之通讯录程序报告Word文档下载推荐.docx
《数据结构课程实践之通讯录程序报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构课程实践之通讯录程序报告Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
4.通讯者信息的修改
5.通讯者信息的删除
6.通讯者链表的输出
1.退出管理系统
请选择0-6:
(2)实现循环和功能选择
假设输入选择用变量sn存储,它作为menu_select函数的返回值提供给switch语句。
使用for循环实现重复选择,并在主函数main()中实现。
#include<
stdio.h>
string.h>
Voidmain()
{
For(;
;
){
Switch(menu_select())
Case1:
Printf(“通讯录链表的建立\n”);
Break;
Case2:
Printf(“通讯者信息的插入\n”);
Case3:
Printf(“通讯者信息的查询\n”);
Printf(“通讯者信息的修改\n”);
Case4:
Case5:
Printf(“通讯者信息的删除\n”);
Case6:
Printf(“通讯录链表的输出\n”);
Case0:
Printf(“再见!
\n”);
Return;
}
(3)得到sn的合理值
如前所述,应该设计一个函数用来输出提示信息和处理输入,这个函数应该返回一个数值sn,以便供给switch语句使用。
假设函数名为menu_select,设计的参考程序如下:
Intmenu_select()
Intsn;
Printf(“通讯录管理系统\n”);
Printf(“===========================\n”);
Printf(“1.通讯录链表的建立\n”);
Printf(“2.通讯者信息的插入\n”);
Printf(“3.通讯者信息的查询\n”);
Printf(“4.通讯者信息的修改\n”);
Printf(“5.通讯者信息的删除\n”);
Printf(“6.通讯者信息的输出\n”);
Printf(“0.退出管理系统\n”);
Printf(“请选择0-6”);
)
Scanf(“%d”,&
sn);
If(sn<
0||sn>
6)
Printf(“\n\t输入错误,重选0-6”);
Else
Break;
Returnsn;
对于sn输入值,在switch中case语句对应数字1-6,对于不符合要求的输入,提示输入错误并要求重新输入。
2.2算法设计
功能模块函数设计
(1)通讯录链表的建立
这个实际上是要求建立一个带头结点的单链表。
这里介绍尾插法建立链表的算法设计思想及具体算法实现。
尾插法建立链表的算法描述如下:
1)使链表的头尾指针head.rear指向新生成的头结点(也是为结点)
2)至结束标志为0
3)设计循环语句
While(结束标志不为真)
循环语句;
4)尾结点指针域置空值NULL
(2)通讯者信息的插入
插入结点的基本思想是:
使用两个指针变量p1和p2分别向当前刚访问过的结点和下一个带访问的结点,循环顺序查找链表,寻找插入结点的位置,其中p1指向待插入位置的前一个结点。
插入操作时非常简单的。
其实现算法描述如下:
1)用p1指向原链表头结点,p2指向链表的第一个结点。
2)设计循环语句如下:
While(p2!
=NULL&
&
p2->
data.num<
p->
data.num)
P1=p2;
P2=p2->
next;
3)插入新结点
(3)在有序链表中查找指定结点
基本思想是:
首先输入要查找的通讯者的编号或姓名,从表头顺序访问表中结点,若查找成功,则返回一个指向查找到的通讯者信息的结点,若查找失败,则返回一个空的指针值NULL.
(4)通讯者信息的修改
信息修改一般只需要修改通讯者的联系电话或通讯地址,因此,先查找到需要修改的通讯者,修改相应的数据项即可。
其算法如下:
VoidChangeNode(LinkListhead)
P=ListFind(head)
If(p!
=NULL){
Printf(“编号姓名性别电话地址\n”);
Printf(“-------------------------------------------\n”);
Printf(“%s,%s,%s,%s\n”,p->
data.num,p->
data.name,
data.sex,p->
data.phone,p->
data.addr);
printf(“------------------------------------------\n”);
printf(“输入该通讯者正确的联系电话通讯地址:
\n中间用空格分隔\n”);
Elseprintf(“没查到要查询的通讯者!
(5)通讯者记录的删除
链表上结点的删除时比较简单的,即先调用查询函数,查询到要删除的结点,删除结点即可。
VoidDelNode(LinkListhead)
LinkNode*p,*q;
P=ListFond(head);
If(p=NULL){
Printf(“没有查到要删除的通讯者\n”);
q=head;
while(q!
=null&
q->
next!
=p)
q=q->
next=p->
free(p)
printf(“通讯者已被删除!
(6)通讯录链表的输出
通讯录链表的输出相对来说比较简单,只要将表头指针赋给一个指针变量p,然后用p向后扫描,直至表尾,p为空为止。
VoidprintList(LinkListhead)
P=head->
While(p!
=NULL)
printf(“----------------------------------------------\n”);
p=p->
完整的程序清单
stdlib.h>
typedefstruct{
charnum[5];
charname[9];
charsex[3];
charphone[13];
charaddr[31];
typedefstructnode{
structnode*next;
}ListNode,*LinkList;
intmenu_select();
LinkListCreateList(void);
voidInsertNode(LinkListhead,ListNode*p);
ListNode*ListFind(LinkListhead);
voidDelNode(LinkListhead);
voidPrintList(LinkListhead);
voidChangeNode(LinkListhead);
voidmain()
for(;
switch(menu_select())
{
case1:
printf("
**************************************\n"
);
printf("
*通讯录链表的建立*\n"
head=CreateList();
break;
case2:
*通信者信息的插入*\n"
请顺序输入编号、姓名、性别、电话和地址\n"
p=(ListNode*)malloc(sizeof(ListNode));
scanf("
%s%s%s%s%s"
p->
p->
InsertNode(head,p);
case3:
*通讯者信息的查询*\n"
p=ListFind(head);
if(p!
printf("
编号姓名性别电话地址\n"
-------------------------------------"
%s%S%s%s%s\n"
p->
}
else
没查到要查询的通讯者!
\n"
case4:
*通讯者信息的修改*\n"
ChangeNode(head);
case5:
*通讯者信息的删除*\n"
DelNode(head);
case6:
*通讯录链表的输出*\n"
PrintList(head);
case0:
\t再见!
return;
}
}
intmenu_select()
intsn;
通讯录管理系统\n"
=====================\n"
1.通讯录链表的建立\n"
2.通信者信息的插入\n"
3.通讯者信息的查询\n"
4.通讯者信息的修改\n"
5.通讯者信息的删除\n"
6.通讯录链表的输出\n"
0.退出管理系统\n"
请选择0-6:
"
{
scanf("
%d"
&
if(sn<
0||sn>
printf("
\n\t输入错误,重选0-6:
else
returnsn;
LinkListCreateList(void)
LinkListhead=(ListNode*)malloc(sizeof(ListNode));
ListNode*p,*rear;
charflag='
y'
rear=head;
while(flag=='
{p=(ListNode*)malloc(sizeof(ListNode));
-----------------------------------------\n"
scanf("
data.name,p->
rear->
next=p;
rear=p;
继续输入么?
(y/n):
getchar();
%c"
flag);
next=NULL;
returnhead;
voidInsertNode(LinkListhead,ListNode*p)
ListNode*p1,*p2;
p1=head;
p2=p1->
while(p2!
=NULL&
strcmp(p2->
data.num)<
0)
p1=p2;
p2=p2->
p1->
p->
next=p2;
ListNode*ListFind(LinkListhead)
ListNode*p;
charnum[5];
charname[9];
intxz;
================\n"
1.按编号查询\n"
2.按姓名查询\n"
请选择:
p=head->
xz);
if(xz==1){
请输入要查找者的编码:
%s"
num);
while(p&
strcmp(p->
data.num,num)<
p=p->
if(p==NULL||strcmp(p->
data.num,num)>
p=NULL;
else
if(xz==2){
请输入要查找者的姓名:
name);
while(p&
data.name,name)!
=0)
p=p->
returnp;
voidDelNode(LinkListhead)
charjx;
ListNode*p,*q;
p=ListFind(head);
if(p==NULL){
没有查到要删除的通讯者!
真的要删除该结点吗?
jx);
if(jx=='
||jx=='
Y'
q=head;
while(q!
q->
q=q->
q->
free(p);
通讯者已被删除!
voidPrintList(LinkListhead)
编号姓名性别电话地址\n"
---------------------------\n"
while(p!
%s%s%s%s%s\n"
p->
---------------------------------\n"
p=p->
voidChangeNode(LinkListhead)
if(p!
输入该通讯者正确的联系电话通讯地址:
\n中间用空格分隔\n"
%s%s"
没查到要查找的通讯者!
第3章.运行与设计
运行结果如下:
通讯录管理系统
===================
1、通讯录链表的建立
2、通讯者信息的插入
3、通讯者信息的查询
4、通讯者信息的修改
5、通讯者信息的删除
6、通讯录链表的输出
1、退出管理系统
====================
选1后按回车,显示:
*************************
*通讯录链表的建立*
请顺序输入编号、姓名、性别、电话和地址
-------------------------------------------------------------------
第4章.设计心得
添加功能:
通讯者信息的查重
基本思想如下:
调用查找函数找出姓名相同的两个通讯者,对其中一个进行修改以示不同。
其基本算法如下:
voidcheckagain(LinkListhead)
P=ListFind(head);
Printf(“没有查到要修改的通讯者\n”);
Printf(“---------------------------------------\n”);
Printf(“------------------------------------------\n”);
Printf(“输入该通讯者正确的姓名”);