数据结构课程设计报告佘远程.docx

上传人:b****5 文档编号:7419592 上传时间:2023-01-23 格式:DOCX 页数:31 大小:204.25KB
下载 相关 举报
数据结构课程设计报告佘远程.docx_第1页
第1页 / 共31页
数据结构课程设计报告佘远程.docx_第2页
第2页 / 共31页
数据结构课程设计报告佘远程.docx_第3页
第3页 / 共31页
数据结构课程设计报告佘远程.docx_第4页
第4页 / 共31页
数据结构课程设计报告佘远程.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

数据结构课程设计报告佘远程.docx

《数据结构课程设计报告佘远程.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告佘远程.docx(31页珍藏版)》请在冰豆网上搜索。

数据结构课程设计报告佘远程.docx

数据结构课程设计报告佘远程

课程设计报告

 

课程设计名称:

数据结构课程设计

系:

三系

学生姓名:

佘远程

班级:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

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

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