数据结构课程设计报告佘远程.docx
- 文档编号:7419592
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:31
- 大小:204.25KB
数据结构课程设计报告佘远程.docx
《数据结构课程设计报告佘远程.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告佘远程.docx(31页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告佘远程
课程设计报告
课程设计名称:
数据结构课程设计
系:
三系
学生姓名:
佘远程
班级:
11计本1班
学号:
20110303132
成绩:
指导教师:
王海燕
开课时间:
2012-2013学年一学期
设计题目一:
通讯录系统的实现
一、实习目的
通过学习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、编码集成以及调试分析,熟练掌握数据结构的选择、设计、实现、以及操作方法,为进一步的开发应用打好基础。
二、问题描述
通讯录管理系统的设计主要是实现对通讯录的管理和相关操作。
基本功能如下:
(1)通讯录信息录入、添加功能:
包括编号号、姓名、性别、电话、地址等。
(2)通讯录查询:
可以按编号,姓名,电话等进行查询。
(3)通讯录修改:
按编号的次序插入有序通讯录表的相应位置。
(4)删除:
按编号,姓名,电话等按升序进行排序。
(5)通讯录的修改、删除功能:
按编号进行查找后,修改电话或地址。
(6)通讯录的输出
三、需求分析
通讯录管理系统工作是管理个人通讯资料,对个人资料进行录入,查询,删除,插入,修改,输出……要求:
(1)输入的数据严格按照程序提示要求进行,否则无法进行数据处理.
(2)查询数据必须提供编号或者名字.
(3)程序主要输出的是各个成员的资料
(4)程序的主要功能:
录入,查询,修改,删除,输出
四、概要设计
(1)系统用到的数据:
charnum[100];charname[100];
charsex[100];
chariphone[100];charaddr[100];
(2)用到的主要函数:
intmenu_select();//菜单程序
linklistcreatelist(void);//创建通讯录链表
voidinsertnode(linklisthead,listnode*p);//插入通讯录链表结点
listnode*listfind(linklisthead);//查找通讯录结点
voiddelnode(linklisthead);//删除链表结点
voidprintlist(linklisthead);//输出链表
voidchangelist(linklisthead);//修改
voidmain()//主函数
(3)各个模块之间的关系:
主函数调用这会儿其他所有的函数
五、详细设计(要有注释)
/*主控菜单处理测试程序*/
#include
#include
#include
#include
typedefstruct{//通讯录结点类型
charnum[100];//编号
charname[100];//姓名
charsex[100];//性别
chariphone[100];//电话
charaddr[100];//地址
}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);//输出链表
voidchangelist(linklisthead);//修改
//主函数
voidmain()
{
for(;;){
switch(menu_select())
{
case1:
printf("***************************\n");
printf("*通讯录链表信息的录入*\n");
printf("****************************\n");
head=createlist();//?
creatlist函数赋给头结点?
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.iphone,p->data.addr);
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.iphone,p->data.addr);
printf("----------------------------------------------------------------------------------\n");
}
else
printf("查询的通讯录成员不存在!
\n");
break;
case4:
printf("************************************\n");
printf("*通讯录成员信息的删除*\n");
printf("*************************************\n");
delnode(head);
break;
case5:
printf("************************************\n");
printf("*通讯录链表成员信息的输出*\n");
printf("*************************************\n");
printlist(head);
break;
case6:
printf("************************************\n");
printf("*通讯录链表成员信息的修改*\n");
printf("*************************************\n");
changelist(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("6.通讯录链表的修改\n");
printf("0.退出管理系统\n");
printf("============================\n");
printf("请选择0-6:
");
for(;;)
{
scanf("%d",&sn);
if(sn<0||sn>6)
printf("\n\t输入错误,重选0-6:
");
else
break;
}
returnsn;
}
//用尾插法建立通讯录链表函数
linklistcreatelist(void)
{//尾插法建立带头结点通讯录链表算法
linklisthead=(listnode*)malloc(sizeof(listnode));//创建头结点
listnode*p,*rear;
intflag=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):
");//这是什么意思啊?
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)//strcmp函数,比较字符串
{
p1=p2;//p1指向刚访问过的结点
p2=p2->next;//p2指向表的下一个结点
}
p1->next=p;//插入p所指向的结点
p->next=p2;//连接表中剩余部分
}
listnode*listfind(linklisthead)
{
listnode*p;
charnum[5];
charname[9];
intxz;
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)<0)//比较字符串比较,编号晓得指向下一个。
p=p->next;
if(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;
}
returnp;
}
voiddelnode(linklisthead)
{
charjx;
listnode*p,*q;
p=listfind(head);//调用查找函数
if(p==NULL){
printf("没有查到要删除的通讯者!
\n");
return;
}
printf("真的要删除该结点吗?
(y/n)");
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");
}
}
voidprintlist(linklisthead)
{
listnode*p;
p=head->next;//因为链表带头接点,使P指向链表开始结点
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.iphone,p->data.addr);
printf("-------------------------------------------------------\n");
p=p->next;
}
}
voidchangelist(linklisthead)//修改
{
linklistp;
charch[20];
printf("输入要修改人姓名:
\n");
gets(ch);
p=head;
intflag=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("输入新sex:
\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)然后可以根据不同的需要选择不同的选项进行操作,
(3)最后退出程序。
八、运行程序过程中产生的问题及采取的措施
(1)在本次试验中我觉得我遇见了一些技术上的难点,刚开始是通讯录的建立,要用到数据结构中的知识,主要要用到链表和结构体。
在通讯录的插入的时候主要是用到学号的升值法插入,在此过程中要申请结点m和n,而且将要插入结点p插在两结点之间。
在通讯录的查询当中主要分为四类:
1).按学号查找的函数;2).按姓名查找的函数;3).按电话查找的函数;4).按住址查找的函数。
其实原理一样,只是使用strcmp()函数匹配出和要查找的通讯者信息相同的结点,并且将其所有的信息输出。
在删除函数我开始觉得删除的时候很困难,后来我是按学号删除的,因为学号是关键字,主要注意在删除后对一些结点需要改变p=p->next;p->next=p->next->next;free(q);如果没找到则q=q->next。
5).遇到问题XX是非常好的老师,我的程序在修改功能上总是出现一些难以察觉的问题,很伤脑筋。
XX了一下相关的情况,误打误撞的还找到了解决的方法,清空缓存。
遇到难点,直接XX学习,也是非常好的办法!
(2)在开始菜单中对应的功能数字是0-6。
可以按照自己想要操作的动作选择对应的数字实现相应的功能。
对于插入主要是按学号的升序来插入通讯者的信息。
在查找中分为四个查找方式:
1)按学号查询2)按姓名查询3)按号码查询4)按地址查询。
在删除中由于学号是主关键字,是唯一的,所以删除按学号来删除会比较方便。
而输出是按一个指针p指向头指针haed,按循环来输出直到p=NULL则结束输出。
参考文献
[1]李建学等著.数据结构课程设计案例精编.清华大学出版社,2007
[2]唐宁九等主编.数据结构与算法(C++版)实验和课程设计教程.清华大学出版社,2008)
设计题目二:
学生成绩管理系统
一.实习目的
通过学习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、编码集成以及调试分析,熟练掌握数据结构的选择、设计、实现、以及操作方法,为进一步的开发应用打好基础。
二.问题描述
实现功能:
输入、输出、查找、读入、显示、保存、排序、退出。
三.需求分析
该程序所做的工作是对学生的成绩的管理,为师生进行学生成绩的记录、查询提供方便。
此程序规定:
1.在成绩录入是,姓名为20个字母以内的字符串;各科成绩为整形;学号长整型,性别和出生日期为字符型;
2.程序的输出主要为:
输出学生的各科成绩及统计数据;
3.程序的功能包括:
成绩的录入、修改、查找、输出和统计;
四.概要设计
1.用到的数据有:
intchinese;//语文
intenglish;//英语
intmath;//数学
longnum;//学号
charname[20];//姓名
charsex[20];//性别
chardate[20];//出生日期
scores;//成绩
2.用到的主要函数:
(1)inthash(intkey);//用除留余数法构造哈希函数
(2)intBuild_Hash(Hash*H,stust);//输入一组关键字,建立Hash表,用链地址法处理冲突
(3)intSearch(Hash*H,intkey);//成绩查询
(4)voidHeapAdjust(HeapType&H,ints,intm);//筛选
(5)voidHeapSort(HeapType&H);//堆排序。
(6)voidSegment(HeapTypeh);//统计各个分数段的人数
(7)intSort(Hash*H);//使用堆排序对各科成绩按从高到低排列输出
(8)voidadd(Hash*H);//录入学生信息
(9)voiddoSearch(Hash*H);//查询学生信息
(10)voiddoSort(Hash*H);//分段统计及排序
(11)voidsavedata(student*&p);
(12)student*getdata();
(13)voidmain();//主函数
3.各程序模块之间的调用关系:
主函数13可以调用所有系统中的子函数。
五.详细设计(要有注释)
#include
#include
#include
#include
typedefstruct//成绩结构体定义
{
intchinese;//语文
intenglish;//英语
intmath;//数学
}score;
typedefstructstudent//学生信息结构体定义
{
longnum;//学号
charname[20];//姓名
charsex[20];//性别
chardate[20];//出生日期
scores;//成绩
structstudent*next;
}student,*stu;
typedefstuHash;//定义哈希表的类型
typedefstruct//堆结构定义
{
intr[20];//记录分数
intlength;//长度
}HeapType;
inthash(intkey);//用除留余数法构造哈希函数
intBuild_Hash(Hash*H,stust);//输入一组关键字,建立Hash表,用拉链法处理冲突
intSearch(Hash*H,intkey);//成绩查询
voidHeapAdjust(HeapType&H,ints,intm);//筛选
voidHeapSort(HeapType&H);//堆排序。
voidSegment(HeapTypeh);//统计各个分数段的人数
intSort(Hash*H);//使用堆排序对各科成绩按从高到低排列输出
voidadd(Hash*H);//录入学生信息
voiddoSearch(Hash*H);//查询学生信息
v
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 远程