ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:19.43KB ,
资源ID:6702072      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6702072.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构课程实践之通讯录程序报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构课程实践之通讯录程序报告.docx

1、数据结构课程实践之通讯录程序报告 哈尔滨理工大学管理学院信息系课程设计(数据结构)班级 _信息11-2班 姓名 学号 * 2013 年 6 月 30日 通讯录管理系统的设计与实现第1章:问题描述通讯录管理系统一般包括通讯者结点信息的插入、查询、删除、更新以及通讯录信息的输出等功能。而通讯者的信息一般包括编号、姓名、性别、电话以及地址等项。现假设链表结点仅含有一个数据域和一个指针域。数据域是为了描述通讯者的有关信息,定义一个通讯者的结点类型:Typedef structChar num5;Char name9;Char sex3;Char phone13;Char addr31;DataType

2、;因此,线性表的链式存储结构定义如下:Typedef struct nodeDataType data;Struct node *next;ListNode *LinkList;ListNode *p;LinkList head;第2章.算法设计2.1数据结构设计 管理信息系统的设计一般都采用自顶向下的设计方法,它是一种逐步求精的设计程序的过程和方法,即对要完成的任务进行分解,先对最高层次中的问题进行定义、设计、编程和测试,而将其中未解决的问题作为一个子任务放到下一层次中去解决,这样逐层、逐个的进行定义、设计、编程和测试,直到所有层次上的问题均由实用程序来解决,就能设计出具有层次结构的程序。1

3、.顶层主控菜单设计(1)设计菜单内容程序运行后,给出6个菜单项的内容和输入提示。1.通讯录链表的建立2.通讯者信息的插入3.通讯者信息的查询4.通讯者信息的修改5.通讯者信息的删除6.通讯者链表的输出1.退出管理系统请选择0-6:(2)实现循环和功能选择假设输入选择用变量sn存储,它作为menu_select函数的返回值提供给switch语句。使用for循环实现重复选择,并在主函数main()中实现。#include#includeVoid main()For(;)Switch(menu_select()Case 1:Printf(“通讯录链表的建立n”);Break;Case 2:Print

4、f(“通讯者信息的插入n”);Break;Case 3:Printf(“通讯者信息的查询n”);Break;Printf(“通讯者信息的修改n”);Break;Case 4:Printf(“通讯者信息的修改n”);Break;Case 5:Printf(“通讯者信息的删除n”);Break;Case 6:Printf(“通讯录链表的输出n”);Break;Case 0:Printf(“再见!n”);Return;(3)得到sn的合理值如前所述,应该设计一个函数用来输出提示信息和处理输入,这个函数应该返回一个数值sn,以便供给switch语句使用。假设函数名为menu_select,设计的参考程

5、序如下:Int menu_select()Int sn ;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(“=n”);Printf(“请选择0-6”);For(;)Scanf(“%d”,&sn);If(sn6)Printf(“nt输入错误,重选0-6”);ElseB

6、reak;Return sn;对于sn输入值,在switch中case语句对应数字1-6,对于不符合要求的输入,提示输入错误并要求重新输入。2.2算法设计功能模块函数设计(1)通讯录链表的建立这个实际上是要求建立一个带头结点的单链表。这里介绍尾插法建立链表的算法设计思想及具体算法实现。尾插法建立链表的算法描述如下:1)使链表的头尾指针head.rear指向新生成的头结点(也是为结点)2)至结束标志为03)设计循环语句While(结束标志不为真)循环语句;4)尾结点指针域置空值NULL(2)通讯者信息的插入插入结点的基本思想是:使用两个指针变量p1和p2分别向当前刚访问过的结点和下一个带访问的结

7、点,循环顺序查找链表,寻找插入结点的位置,其中p1指向待插入位置的前一个结点。插入操作时非常简单的。其实现算法描述如下:1)用p1指向原链表头结点,p2指向链表的第一个结点。2)设计循环语句如下:While(p2!=NULL&p2-data.numdata.num)P1=p2;P2=p2-next;3)插入新结点(3)在有序链表中查找指定结点基本思想是:首先输入要查找的通讯者的编号或姓名,从表头顺序访问表中结点,若查找成功,则返回一个指向查找到的通讯者信息的结点,若查找失败,则返回一个空的指针值NULL.(4)通讯者信息的修改信息修改一般只需要修改通讯者的联系电话或通讯地址,因此,先查找到需要

8、修改的通讯者,修改相应的数据项即可。其算法如下:Void ChangeNode(LinkList head)ListNode *p;P=ListFind(head)If(p!=NULL)Printf(“编号 姓名 性别 电话 地址n”);Printf(“-n”);Printf(“%s,%s,%s,%sn”,p-data.num,p-data.name,p-data.sex,p-data.phone,p-data.addr);printf(“-n”);printf(“输入该通讯者正确的联系电话 通讯地址:n中间用空格分隔n”);Else printf(“没查到要查询的通讯者!n”);Break;

9、(5)通讯者记录的删除链表上结点的删除时比较简单的,即先调用查询函数,查询到要删除的结点,删除结点即可。其算法如下:Void DelNode(LinkList head)LinkNode *p,*q;P=ListFond(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”);(6)通讯录链表的输出通讯录链表的输出相对来说比较简单,只要将表头指针赋给一个指针变量p,然后用p向后扫描,直至表尾,p为空

10、为止。其算法如下:Void printList(LinkList head)ListNode *p;P=head-next;Printf(“编号 姓名 性别 电话 地址n”);Printf(“-n”);While(p!=NULL)Printf(“%s,%s,%s,%sn”,p-data.num,p-data.name,p-data.sex,p-data.phone,p-data.addr);printf(“-n”);p=p-next;完整的程序清单#include#include#includetypedef structchar num5;char name9;char sex3;char

11、phone13;char addr31;DataType;typedef struct nodeDataType data;struct node *next;ListNode,*LinkList;LinkList head;ListNode *p;int menu_select();LinkList CreateList(void);void InsertNode(LinkList head,ListNode *p);ListNode *ListFind(LinkList head);void DelNode(LinkList head);void PrintList(LinkList he

12、ad);void ChangeNode(LinkList head);void main() for(;) switch(menu_select() case 1: printf(*n); printf(* 通 讯 录 链 表 的 建 立 * n); printf(*n); head=CreateList(); break; case 2: printf(*n); printf(* 通 信 者 信 息 的 插 入 *n); printf(*n); printf(请顺序输入编号、姓名、性别、电话和地址n); printf(*n); p=(ListNode *)malloc(sizeof(List

13、Node); scanf(%s%s%s%s%s,p-data.num,p-data.name, p-data.sex,p-data.phone,p-data.addr); InsertNode(head,p); break; case 3: printf(*n); printf(* 通 讯 者 信 息 的 查 询 *n); printf(*n); p=ListFind(head); if(p!=NULL) printf(编号 姓名 性别 电话 地址 n); printf(-); printf(%s %S %s %s %sn,p-data.num,p-data.name, p-data.sex,

14、p-data.phone,p-data.addr); printf(-); else printf(没查到要查询的通讯者!n); break; case 4: printf(*n); printf(* 通 讯 者 信 息 的 修 改 *n); printf(*n); ChangeNode(head); break; case 5: printf(*n); printf(* 通 讯 者 信 息 的 删 除 *n); printf(*n); DelNode(head); break; case 6: printf(*n); printf(* 通 讯 录 链 表 的 输 出 *n); printf(

15、*n); PrintList(head); break; case 0: printf(t 再 见 !n); return; int menu_select() int sn; 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(=n); printf( 请 选 择 0

16、-6:); for(;) scanf(%d,&sn); if(sn6) printf(nt输入错误,重选0-6:); else break; return sn;LinkList CreateList(void) LinkList head=(ListNode *)malloc(sizeof(ListNode); ListNode *p,*rear; char flag=y; rear=head; while(flag=y) p=(ListNode *)malloc(sizeof(ListNode); printf(请顺序输入编号、姓名、性别、电话和地址n); printf(-n); scan

17、f(%s%s%s%s%s,p-data.num,p-data.name,p-data.sex,p-data.phone,p-data.addr); rear-next=p; rear=p; printf(继续输入么?(y/n):); getchar(); scanf(%c,&flag); rear-next=NULL; return head;void InsertNode(LinkList head,ListNode *p) ListNode*p1,*p2; p1=head; p2=p1-next; while(p2!=NULL & strcmp(p2-data.num,p-data.num

18、)next; p1-next=p; p-next=p2;ListNode *ListFind(LinkList head) ListNode *p; char num5; char name9; int xz; printf(=n); printf( 1.按编号查询 n); printf( 2.按姓名查询 n); printf(=n); printf( 请 选 择:); p=head-next; scanf(%d,&xz); if(xz=1) printf(请输入要查找者的编码:); scanf(%s,num); while(p & strcmp(p-data.num,num)next; if

19、(p=NULL |strcmp(p-data.num,num)0) p=NULL; else if(xz=2) printf(请输入要查找者的姓名:); scanf(%s,name); while(p & strcmp(p-data.name,name)!=0) p=p-next; return p;void DelNode(LinkList head) char jx; ListNode *p,*q; p=ListFind(head); if(p=NULL) printf(没有查到要删除的通讯者!n); return; printf(真的要删除该结点吗?(y/n):); getchar();

20、 scanf(%c,&jx); if(jx=y|jx=Y) q=head; while(q!=NULL & q-next!=p) q=q-next; q-next=p-next; free(p); printf(通讯者已被删除!n); void PrintList(LinkList head) ListNode *p; p=head-next; printf(编号 姓名 性别 电话 地址n); printf(-n); while(p!=NULL) printf(%s %s %s %s %sn,p-data.num,p-data.name, p-data.sex,p-data.phone,p-d

21、ata.addr); printf(-n); p=p-next; void ChangeNode(LinkList head) ListNode *p; p=ListFind(head); if(p!=NULL) printf(编号 姓名 性别 电话 地址n); printf(-n); printf(%s %s %s %s %sn,p-data.num,p-data.name, p-data.sex,p-data.phone,p-data.addr); printf(-n); printf(输入该通讯者正确的联系电话 通讯地址:n中间用空格分隔n); scanf(%s%s,p-data.pho

22、ne,p-data.addr); else printf(没查到要查找的通讯者!n);第3章.运行与设计运行结果如下:通讯录管理系统=1、通讯录链表的建立2、通讯者信息的插入3、通讯者信息的查询4、通讯者信息的修改5、通讯者信息的删除6、通讯录链表的输出1、退出管理系统=请选择0-6:选1后按回车,显示:*通 讯 录 链 表 的 建 立*请顺序输入编号、姓名、性别、电话和地址-第4章.设计心得添加功能:通讯者信息的查重基本思想如下:调用查找函数找出姓名相同的两个通讯者,对其中一个进行修改以示不同。其基本算法如下:void checkagain(LinkList head)ListNode *p;P=ListFind(head);If(p=NULL)Printf(“没有查到要修改的通讯者n”);Return;ElsePrintf(“编号 姓名 性别 电话 地址n”);Printf(“-n”);Printf(“%s,%s,%s,%sn”,p-data.num,p-data.name,p-data.sex,p-data.phone,p-data.addr);Printf(“-n”);Printf(“输入该通讯者正确的姓名”);

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1