1、数据结构课程设计报告佘远程 课 程 设 计 报 告课程设计名称:数据结构课程设计 系 : 三系 学 生 姓 名 : 佘远程 班 级: 11计本1班 学 号: 20110303132 成 绩: 指 导 教 师: 王海燕 开 课 时 间:2012-2013学年一学期设计题目一:通讯录系统的实现一、 实习目的 通过学习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、编码集成以及调试分析,熟练掌握数据结构的选择、设计、实现、以及操作方法,为进一步的开发应用打好基础。二、 问题描述通讯录管理系统的设计主要是实现对通讯录的管理和相关操作。基本功能如下:(1)通讯录信息录入、添加功能:
2、包括编号号、姓名、性别、电话、地址等。(2)通讯录查询:可以按编号, 姓名, 电话等进行查询。(3)通讯录修改:按编号的次序插入有序通讯录表的相应位置。(4)删除:按编号, 姓名, 电话等按升序进行排序。(5)通讯录的修改、删除功能:按编号进行查找后,修改电话或地址。(6)通讯录的输出三、 需求分析 通讯录管理系统工作是管理个人通讯资料,对个人资料进行录入,查询,删除,插入,修改,输出要求:(1)输入的数据严格按照程序提示要求进行,否则无法进行数据处理.(2)查询数据必须提供编号或者名字.(3)程序主要输出的是各个成员的资料(4)程序的主要功能:录入,查询,修改,删除,输出四、 概要设计(1)
3、 系统用到的数据: char num100; char name100; char sex100; char iphone100; char addr100; (2) 用到的主要函数:int menu_select(); /菜单程序linklist createlist(void); /创建通讯录链表void insertnode(linklist head,listnode *p); /插入通讯录链表结点listnode *listfind(linklist head); /查找通讯录结点void delnode(linklist head); /删除链表结点void printlist(l
4、inklist head); /输出链表void changelist(linklist head);/修改void main()/主函数(3) 各个模块之间的关系:主函数调用这会儿其他所有的函数五、 详细设计(要有注释) /*主控菜单处理测试程序*/#include#include#include#include /头文件代表什么意思?typedef struct /通讯录结点类型 char num100; /编号 char name100; /姓名 char sex100; /性别 char iphone100; /电话 char addr100; /地址datatype;typedef
5、struct node /结点类型定义 datatype data; /结点数据域 struct node*next; /结点指针域listnode;typedef listnode*linklist;linklist head;listnode *p;/子函数的声明int menu_select(); /菜单程序linklist createlist(void); /创建通讯录链表void insertnode(linklist head,listnode *p); /插入通讯录链表结点listnode *listfind(linklist head); /查找通讯录结点void delno
6、de(linklist head); /删除链表结点void printlist(linklist head); /输出链表void changelist(linklist head);/修改/主函数void main() for( ; ; ) switch(menu_select() case 1: printf(*n); printf(* 通讯录链表信息的录入 *n); printf(*n); head=createlist(); /?creatlist函数赋给头结点? break; case 2: printf(*n); printf(* 通讯录成员信息的插入 *n); printf(*
7、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.iphone,p-data.addr); insertnode(head,p); break; case 3: printf(*n); printf(* 通讯录成员信息的查询 *n); printf(*n); p=listfind(head); if(p!=NULL) printf(编号 姓名 性别
8、联系电话 地址n); printf(-n); printf( %s, %s, % s, %s, %sn,p-data.num,p-data.name,p-data.sex,p-data.iphone,p-data.addr); printf(-n); else printf(查询的通讯录成员不存在!n); break; case 4: printf(*n); printf(* 通讯录成员信息的删除 *n); printf(*n); delnode(head); break; case 5: printf(*n); printf(* 通讯录链表成员信息的输出 *n); printf(*n); p
9、rintlist(head); break; case 6: printf(*n); printf(* 通讯录链表成员信息的修改 *n); printf(*n); changelist(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);
10、 printf( 5.通讯录链表的输出n); printf( 6.通讯录链表的修改n); printf( 0.退出管理系统n); printf(=n); printf( 请选择0-6: ); for( ; ; ) scanf(%d,&sn); if(sn6) printf(nt输入错误,重选0-6: ); else break; return sn; /用尾插法建立通讯录链表函数linklist createlist(void) /尾插法建立带头结点通讯录链表算法 linklist head=(listnode *)malloc(sizeof(listnode); /创建头结点 listnod
11、e *p,*rear; int flag=0; /结束标志置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.iphone,p-data.addr); rear-next=p; /新结点连接到尾结点之后 rear=p; /尾指针指向新结点 printf(是否继续建立? (1/0)
12、:); /这是什么意思啊? scanf(%d,&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)next; /p2指向表的下一个结点 p1-next=p; /插入p所指向的结点 p-next=p2; /连接表中剩余部分listnode *listfind(li
13、nklist 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(p=NULL | strcmp(p-data.num,num)0) p=NU
14、LL; /没有查到要查找的通讯者 elseif(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); scanf(%c,&jx); if(jx=y|jx=Y) q=
15、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; /因为链表带头接点,使P指向链表开始结点 printf(编号 姓名 性别 联系电话 地址n); printf(-n); while(p!=NULL) printf(%s,%s,%s,%s,%sn,p-data.num,p-data.name,p-data.sex,p-data.i
16、phone,p-data.addr); printf(-n); p=p-next; void changelist(linklist head) /修改 linklist p; char ch20; printf(输入要修改人姓名:n); gets(ch); p=head; int flag=0; /用来判断是否修改 while(p!=NULL) if(strcmp(p-data.name,ch)=0)/比较函数比较两个数据 printf(输入新num:n); gets(p-data.num); printf(输入新name:n); gets(p-data.name); printf(输入新s
17、ex:n); gets(p-data.sex); printf(输入新phone:n); gets(p-data.iphone); printf(输入新addres:n); gets(p-data.addr); flag=1; /找到并修改成功 p=p-next; if(flag=1) printf(修改完成n);else printf(对不起,无此记录!请重新输入。);六、 测试分析七、 使用说明(1)首先运行程序,包括六个选项,0.退出系统. 1.成绩录入 2.成绩查询. 3.成绩修改4.删除成绩. 5.输出所有人成绩 . 6.统计各科总成绩. (2)然后可以根据不同的需要选择不同的选项进
18、行操作,(3)最后退出程序。八、 运行程序过程中产生的问题及采取的措施(1)在本次试验中我觉得我遇见了一些技术上的难点,刚开始是通讯录的建立,要用到数据结构中的知识,主要要用到链表和结构体。在通讯录的插入的时候主要是用到学号的升值法插入,在此过程中要申请结点m和n,而且将要插入结点p插在两结点之间。 在通讯录的查询当中主要分为四类:1).按学号查找的函数;2).按姓名查找的函数;3).按电话查找的函数;4).按住址查找的函数。其实原理一样,只是使用strcmp()函数匹配出和要查找的通讯者信息相同的结点,并且将其所有的信息输出。在删除函数我开始觉得删除的时候很困难,后来我是按学号删除的,因为学
19、号是关键字,主要注意在删除后对一些结点需要改变p=p-next; p-next=p-next-next;free(q); 如果没找到则q=q-next。5).遇到问题XX是非常好的老师,我的程序在修改功能上总是出现一些难以察觉的问题,很伤脑筋。XX了一下相关的情况,误打误撞的还找到了解决的方法,清空缓存。遇到难点,直接XX学习,也是非常好的办法!(2)在开始菜单中对应的功能数字是0-6。可以按照自己想要操作的动作选择对应的数字实现相应的功能。对于插入主要是按学号的升序来插入通讯者的信息。在查找中分为四个查找方式:1)按学号查询2)按姓名查询3)按号码查询4)按地址查询。在删除中由于学号是主关键
20、字,是唯一的,所以删除按学号来删除会比较方便。而输出是按一个指针p指向头指针haed,按循环来输出直到p=NULL则结束输出。参考文献 1 李建学等著.数据结构课程设计案例精编.清华大学出版社,20072 唐宁九等主编.数据结构与算法(C+版)实验和课程设计教程. 清华大学出版社,2008)设计题目二:学生成绩管理系统一 实习目的 通过学习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、编码集成以及调试分析,熟练掌握数据结构的选择、设计、实现、以及操作方法,为进一步的开发应用打好基础。二 问题描述实现功能:输入、输出、查找、读入、显示、保存、排序、退出。三 需求分析 该程
21、序所做的工作是对学生的成绩的管理,为师生进行学生成绩的记录、查询提供方便。此程序规定: 1.在成绩录入是,姓名为20个字母以内的字符串;各科成绩为整形;学号长整型,性别和出生日期为字符型; 2.程序的输出主要为:输出学生的各科成绩及统计数据;3.程序的功能包括:成绩的录入、修改、查找、输出和统计;四 概要设计1.用到的数据有:int chinese;/语文 int english;/英语 int math;/数学long num; /学号 char name20; /姓名 char sex20; /性别 char date20; /出生日期 score s; /成绩2.用到的主要函数:(1)i
22、nt hash(int key); /用除留余数法构造哈希函数(2)int Build_Hash(Hash *H,stu st);/输入一组关键字,建立Hash表,用链地址法处理冲突(3)int Search(Hash *H,int key);/成绩查询(4)void HeapAdjust (HeapType &H , int s, int m);/筛选(5)void HeapSort(HeapType &H);/ 堆排序。(6)void Segment(HeapType h);/统计各个分数段的人数(7)int Sort(Hash *H);/使用堆排序对各科成绩按从高到低排列输出(8)voi
23、d add(Hash *H);/录入学生信息(9)void doSearch(Hash *H);/查询学生信息(10)void doSort(Hash *H);/分段统计及排序(11)void savedata(student *&p);(12)student *getdata();(13)void main(); /主函数3.各程序模块之间的调用关系:主函数13可以调用所有系统中的子函数。五 详细设计(要有注释)#include #include #include #include typedef struct /成绩结构体定义 int chinese; / 语文 int english;
24、/英语 int math; /数学score;typedef struct student /学生信息结构体定义 long num; /学号 char name20; /姓名 char sex20; /性别 char date20; /出生日期 score s; /成绩 struct student *next;student,*stu;typedef stu Hash;/定义哈希表的类型typedef struct /堆结构定义 int r20; /记录分数 int length; /长度HeapType;int hash(int key); /用除留余数法构造哈希函数int Build_Hash(Hash *H,stu st); /输入一组关键字,建立Hash表,用拉链法处理冲突int Search(Hash *H,int key); /成绩查询void HeapAdjust (HeapType &H , int s, int m); /筛选void HeapSort(HeapType &H); / 堆排序。void Segment(HeapType h); /统计各个分数段的人数int Sort(Hash *H); /使用堆排序对各科成绩按从高到低排列输出void add(Hash *H); /录入学生信息void doSearch(Hash *H); /查询学生信息v
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1