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

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

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

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

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

数据结构课程设计报告

 

数据结构

课程设计报告

 

学生学号:

************

学生姓名:

*******

专业班级:

*******

指导教师:

************

 

 

 

单位员工通讯录管理系

1.问题描述

为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号、及电子邮箱。

其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。

2.主要数据类型和函数

建立员工信息管理系统用到链表的储存结构,通过单链表实现所有操作

可定义如下的存储结构:

typedefstructstaff{/*员工通讯信息的结构类型定义*/

charnum;/*员工编号*/

charname[8];/*员工姓名*/

charphone;/*办公室电话号码*/

charcall;/*手机号码*/

structstaff*next;

}staff,*Linkliust;

主要函数:

LinkListCreat(),voidSearch(),voidDelete(),voidInsert(),voidchange().

3.算法设计

A、首先先创建一个链表,定义一个结构体包含一个next指针和一个DataType型数据data,构造一个指针类型的函数LinkListCreat(LinkList&L),需要先弄一个头指针head并对其开辟一个空间再通过一个循环实现链表的储存功能。

创建后要对其进行一系列操作,查找、删除、插入、修改。

B、查找操作:

根据输入的需要查找的选项,再利用t利用一个循环体while(p&&p->data.num!

=t){p=p->next;}找到所需要查找的信息。

C、删除操作:

也是根据输入要删除的选项,先查找到要删除的信息位置

while(p->next&&p->next->data.num!

=t)

{p=p->next;}

if(p->next){

s=p->next;

p->next=s->next;

free(s);}通过指针的变换来实现删除。

D、修改操作:

先输入要修改的选项,然后选择要修改的项目进行修改。

4、调试及测试结果

1、建立记录2、查询记录

其他测试结果这里不一一列举(源代码见附录)

停车场管理(栈和队列的应用)

1、问题描述

设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。

汽车在停车场内按车辆到达时间的先后顺序,依次有北向南排列(大门在最南端,最先到达的第一车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。

试为停车场编制按上述要求进行管理的模拟程序。

2、需求分析

停车场管理系统,以栈模拟停车场,以队列模拟车场外的便道。

首先来的车辆要进入停车厂或者进入便道。

当停车场车辆未满时直接将车停入停车场。

当停车场车辆停满时,则此时进入的车辆应该进入便道。

然后等待停车场中的车辆离去,离去一辆车则便道中的车辆进入停车场。

栈以顺序存储结构实现,队列以链表结构实现

3、算法设计

算法思路:

模拟停车场管理,需要用一个栈来表示停车场,然后用一个队列用来表示车站停满车时把车停在停车场外的便道上。

本实验要定义一个队列两个栈,其中一个栈可以辅助停车场中的车辆离开,即离开一辆车时,在此车前面的车依次进入辅助栈,离开后这些车辆再进入停车栈,然后判断队列中是否有车,如果有则将便道队列中的车辆移进停车厂。

否则不进行操作。

关于费用的计算,出车站的时间减去进车站的时间得到的时间差再乘以每小时的停车费用就是这辆车本次停车所需要交的费用

4、主要函数

voidchushihua(SqStack&S)S.base=S.top=S.stop;初始化

voidjinche(SqStack&S,LinkQueue&L)车进栈

voidchuche(SqStack&S,SqStack&q,LinkQueue&L)车出栈

5、调试并运行

进车车已进满,再来的车将进入便道

出车

出车后,因为便道内有车,所以便道内的车开始进停车场。

其他测试结果这里不一一列

详细代码见附录

 

哈夫曼编码/译码系统(树应用)

1、问题分析

利用哈夫曼编码进行通信,可以压缩通信的数据量,提高传输效率,缩短信息的传输时间,还有一定的保密性。

现在要求编写一程序模拟传输过程,实现在发送前将要发送的字符信息进行编码,然后进行发送,接收后将传来的数据进行译码,即将信息还原成发送前的字符信息。

 

2、需求分析

在本例中设置发送者和接受者两个功能,

发送者的功能包括:

①输入待传送的字符信息;

②统计字符信息中出现的字符种类数和各字符出现的次数(频率);

②根据字符的种类数和各自出现的次数建立哈夫曼树;

③利用以上哈夫曼树求出各字符的哈夫曼编码;

④将字符信息转换成对应的编码信息进行传送。

接受者的功能包括:

①接收发送者传送来的编码信息;

②利用上述哈夫曼树对编码信息进行翻译,即将编码信息还原成发送前的字符信息。

从以上分析可发现,在本例中的主要算法有三个:

(1)哈夫曼树的建立;

(2)哈夫曼编码的生成;

(3)对编码信息的翻译。

3、算法设计

首先读入一组字符,然后统计这些字符中不同字符出现的次数,并当做其权值,然后根据不同字符及其权值建立哈弗曼树。

建立哈弗曼树后即可得到这些不同字符的哈弗曼编码,然后即可根据这些哈弗曼编码对那组输入的一串字符进行哈弗曼编码。

译码是根据一组编码翻译成一组字符的操作,其算法就是根据这一串编码来对哈弗曼树进行遍历,每遍历到一个叶子结点即输出一个字符,直至将编码操作完即可完成多编码的翻译操作。

4、主要函数

voidtongji(char*d1,int*w,char*d,int&n)对个字符出现的频率进行统计

voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn,char*d)构建哈夫曼树

voidbianma(HuffmanCodeHC,char*d1,char*d,char*bc)哈夫曼编码

voidyima(HuffmanTreeHT,intn,char*bc)有编码得到译码

5、调试并运行

输入一段字符后,尖括号中表示的是该字符的出现的频率,并得到哈夫曼编码,最后又编码得到译码

教学计划编制问题(图的应用)

1、问题分析

大学的每个专业都要制定教学计划。

假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限值均相等。

每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。

每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。

每门课恰好占一个学期。

试在这样的前提下设计一个教学计划编制程序。

2、需求分析

1.输入参数应包括:

学期总数,一学期的学分上限,每门课的课程号(可以是固定占3位的字母数字串)、学分和直接先修课的课程号。

2.应允许用户指定下列两种编排策略之一:

一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。

3.若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。

计划的表格格式可以自己设计。

4.可设学期总数不超过12,课程总数不超过100。

如果输入的先修课程号不在该专业开设的课程序列中,则作为错误处理。

3、算法分析

对于有向图,我们采取邻接表作为数据结构。

首先确定学期数和每学期的学分总数上限,不能一学期将很多课全部学完。

然后根据输入的计划课程树和输入的拓扑排序所形成的课程先修关系建立拓扑图。

在拓扑排序的过程之中,输入入度为零(即没有前趋)的顶点,同时将该顶点的直接后继的入度减1。

(1)、查邻接表中入度为零的顶点,并进栈。

(2)、当栈为空时,进行拓扑排序。

(a)、退栈,输出栈顶元素V。

(b)、在邻接表中查找Vj的直接后继Vk,将Vk的入度减一,并令入度减至零的顶点进栈。

表节点(弧结构);

typedefstructArcNode{

}ArcNode;

头结点;

typedefstruct{

}VNode,AdjList[MAX_VERTEX_NUM];

图结构;

typedefstruct{

}ALGraph;

操作结果:

若G中存在顶点u,则返回该顶点在图中位置;否则返回-1;

intLocateVex(ALGraphG,VertexTypeu)

采用邻接表存储结构,构造没有相关信息的图G(用一个函数构造种图);

StatusCreateGraph(ALGraph&G)

输出图的邻接矩阵G;

voidDisplay(ALGraphG)

求顶点的入度;

voidFindInDegree(ALGraphG,intindegree[])

顺序栈;

typedefstructSqStack{

}SqStack;

构造一个空栈S;

StatusInitStack(SqStack*S)

清空栈的操作;

voidClearStack(SqStack*S)

若栈S为空栈,则返回TRUE,否则返回FALSE;

StatusStackEmpty(SqStackS)

若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR;

StatusPop(SqStack*S,SElemType*e)

插入元素e为新的栈顶元素;

StatusPush(SqStack*S,SElemTypee)

求大学所有课程总学分;

Statuszxf(ALGraphG)

程序的核心函数:

StatusTopologicalSort(ALGraphG)

有向图G采用邻接表存储结构,若G无回路,则按用户选择的方案输出G的顶点的一个拓扑序列并返回OK,否则返回ERROR;

4、调试并运行

运行结果:

使学习负担尽量均匀:

使课程尽量分布在前几个学期:

 

药品销售统计系统(排序应用)

1、问题分析

在本设计中,首先从数据文件中读出各药品的信息记录,存储在顺序表中。

各药品的信息包括:

药品编号、药名、药品单价、销出数量、销售额。

药品编号共4位,采用字母和数字混合编号,如:

A125,前一位为大写字母,后三位为数字,按药品编号进行排序时,可采用基数排序法。

对各药品的单价、销售量或销售额进行排序时,可采用多种排序方法,如直接插入排序、冒泡排序、快速排序,直接选择排序等方法。

在本设计中,对单价的排序采用冒泡排序法,对销售量的排序采用快速排序法,对销售额的排序采用堆排序法。

2、算法分析

A、拿一个和后边的比较如果大,则后移,一趟结束后最大的放到最后边了,然后循环调用实现排序。

B、快速排序:

用两个指针low和high分别指向头和尾,首先以头元素为轴,如果high大于轴元素,high--,否则把high指针指向的元素赋给low,然后low++,如果low指向的元素小于轴low++,反之把low指向的元素赋给high,依次递归调用实现快速排序。

C、基数排序:

基数排序是借助“分配”和“收集”两种操作对单逻辑关键字进行排序的一种内部排序方法。

先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。

再将各组连接起来,便得到一个有序序列。

D、销售额使用的是堆排序,堆排序首先要建立一个完全二叉树的堆,其标准符合为父节点始终比子节点大。

然后依次输出顶结点,然后在建立一个符合标准的堆重复操作即可。

3、调试并运行

 

测试数据为yaopin.txt文件,文件内容如下:

A234安乃近0.3210032.5

B123阿莫西林0.55060.5

C455银翘片0.432060.3

D345金银花0.123050.4

D432诺氟沙星0.648023.5

F872罗红霉素1.535100.34

J234吗丁啉0.586396.6

S342青霉素0.341020.7

 

运行界面如下

药品信息的输出

按药品编号排序(基数排序)按单价排序(冒泡排序)

按销售量排序(快速排序)按销售额排序(堆排序)

校园导游咨询(最短路径)

1、问题分析

设计一个校园导游程序,为来访的客人提供各种信息查询服务。

要求:

(1)设计学校的校园平面图,所含景点不少于10个,以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。

(2)为来访客人提供图中任意景点相关信息的查询。

(3)为来访客人提供景点的问路查询,即已知一个景点,查询到某景点之间的一条最短路径及长度。

2、算法分析设计

校园导游咨询要提供一些信息,主要是构建一个图,采用邻接矩阵储存,然后找到两点间的最短路径。

这里求最短路径采用迪杰斯特拉算法求最短路径。

迪杰斯特算法是根据路径长度递增的顺序求解从顶点Vo到其他个顶点的最短路径。

对于图G=(V,E),逐个将尚未求出最短路径的顶点集合加入到已经求出最短路径的重点集合中:

voidshortestpath_DIJ(intnum)//迪杰斯特拉算法最短路径

{

intv,w,i,t;//i、w和v为计数变量//t表示景点个数

intfinal[NUM];//标志数组、用来存放顶点的信息

intmin;//记录权值、最终输出路径

for(v=0;v

{

final[v]=FALSE;//假设从顶点num到顶点v没有最短路径

D[v]=G.arc[num][v].length;//将num到其余顶点的最短路径长度初始化为权值

for(w=0;w

path[v][w]=FALSE;//初始化从v到w的路径值

if(D[v]

{

path[v][num]=TURE;//存在标志置为一

path[v][v]=TURE;//自身到自身

}}

D[num]=0;//初始化新路径

final[num]=TURE;//初始化num顶点属于final集合

//开始主循环,每一次求得num到某个顶点的最短路径,并将其加入到final集合

for(i=0;i

{

min=MAX;//当前所知离顶点num的最近距离

for(w=0;w

if(!

final[w])//w顶点在v-s中

if(D[w]

{

v=w;

min=D[w];

}

final[v]=TURE;//离num顶点更近的v加入到s集合

for(w=0;w

if(!

final[w]&&((min+G.arc[v][w].length)

{

D[w]=min+G.arc[v][w].length;//更新路径

for(t=0;t

path[w][t]=path[v][t];

path[w][w]=TURE;

}

}}

3、调试并运行

运行界面

中工简介

景点信息查询

输入相关的景点编号即可利用迪杰斯特拉算法求出最短路径

景点距离查询:

课程设计心得

经过三周的努力,课程设计终于完成了。

因为是在假期后开学前进行课设,任务量也非常大,再加上上学期数据结构基础不是非常扎实,好多数据结构知识点意思模糊,所以这次的课设对我来说很吃力,一方面要复习学过的知识,一方面还要对程序经行优化,尽管如此,我并没有放弃,而是一步步走过来。

遇到问题不会,就翻阅书籍查询,在这次课设中也得到了老师和同学们的帮助。

有些程序算法也借鉴网上的相关文档对自己的算法经行优化。

这次课设虽然艰难,但是我从中学习到了很多,也认识到自己存在的很多问题:

自己对算法优化不够好,而且代码练得还是太少,编程经验不足。

所以在今后的学习中,在强化知识巩固的同时更要注重实践。

在学习中,要熟记各种数据类型定义特点和基本运算,并把这些东西在实践中强化。

我相信经过我的不懈努力,我的编程技巧一定会逐渐上升。

附录

1、单位员工通讯录管理系统:

#include

#include

#include

#defineNULL0

typedefstructstaff//////////////////员工通讯信息结构类型的定义

{intnum;//员工编号

charname[8];//员工姓名

intphone;//手机号码

intcall;//电话号码

structstaff*next;

}staff,*LinkList;

//建立链表

LinkListCreat()

{

inti,n;

staff*p;

LinkListL;

L=(LinkList)malloc(sizeof(staff));

L->next=NULL;

printf("请输入员工数:

");

scanf("%d",&n);

printf("\n\n\t\t\t***新建通讯录***\n");

for(i=0;i

{p=(staff*)malloc(sizeof(staff));

printf("员工编号:

");

scanf("%d",&p->num);

printf("员工姓名:

");

scanf("%s",p->name);

printf("手机号码:

");

scanf("%d",&p->phone);

printf("电话号码:

");

scanf("%d",&p->call);

p->next=L->next;

L->next=p;

printf("\t\t\t****输入成功!

***\n");}

returnL;

}

//查找

voidSearch(staff*l)

{intm;

staff*p;

p=l->next;

printf("\n\n\t\t\t**查询通讯录记录**\n");

printf("\n\t\t\t请选择查询方式:

\n");

printf("\t\t\t*****************\n");

printf("\t\t\t#1------编号#\n");

printf("\t\t\t#2------姓名#\n");

printf("\t\t\t#3------手机#\n");

printf("\t\t\t#4------电话#\n");

printf("\t\t\t*****************\n");

printf("\t\t\t请选择:

");

scanf("%d",&m);

while(m!

=1&&m!

=2&&m!

=3&&m!

=4)

{printf("\t输入错误!

!

!

请重新选择:

");

scanf("%d",&m);

};

if(m==1)//按编号查询

{intt;

printf("\n请输入想查询的编号:

");

scanf("%d",&t);

while(p&&(p->num)!

=t)

{p=p->next;}

if(p==NULL)

{printf("\t通讯录中没有此人!

\n");}

else

{printf("\n\t\t\t****员工信息****\n");

printf("员工编号:

%d\n",p->num);

printf("员工姓名:

%s\n",p->name);

printf("手机电话:

%d\n",p->phone);

printf("电话号码:

%d\n",p->call);}

};

if(m==2)//按姓名查询

{chars[8];

printf("\n请输入想查询的姓名:

");

scanf("%s",s);

while(strcmp(p->name,s)!

=0&&(p!

=0))

{p=p->next;}

if(strcmp(p->name,s)==0)

{printf("\n\t\t\t****员工信息****\n");

printf("员工编号:

%d\n",p->num);

printf("员工姓名:

%s\n",p->name);

printf("手机号码:

%d\n",p->phone);

printf("电话号码:

%d\n",p->call);

}

else

printf("\t通讯录中没有此人!

\n");

};

if(m==3)//按手机号码查询

{intt;

printf("\n请输入想查询的手机号码:

");

scanf("%d",&t);

while(p&&(p->phone)!

=t)

{p=p->next;}

if(p!

=0)

{printf("\n\t\t\t****员工信息****\n");

printf("员工编号:

%d\n",p->num);

printf("员工姓名:

%s\n",p->name);

printf("手机号码:

%d\n",p->phone);

printf("电话号码:

%d\n",p->call);

}

else

printf("\t通讯录中没有此人!

\n");

};

if(m==4)//按电话号码查询

{intt;

printf("\n请输入想查询的电话号码:

");

scanf("\t%d",&t);

while(p&&p->call!

=t)

{p=p->next;}

if(p!

=0)

{printf("\n\t\t\t****员工信息****\n");

printf("员工编号:

%d\n",p->num);

printf("员工姓名:

%s\n",p->name);

printf("手机号码:

%d\n",p->phone);

printf("电话号码:

%d\n",p->call);

}

else

printf("\t通

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

当前位置:首页 > 自然科学 > 物理

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

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