数据结构课程设计报告

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

课程设计报告

题目:在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用(邻接表和邻接矩阵)两种,采用课本上的两种求解算法。

一、需求分析

1.1已知一个无向连通网表示n个城市以及城市间可能设置的通信网络线路,其中网的顶点表示城市,边表示两个城市之间的线路,赋于边上的权值表示相应的代价。对于n个点的连通网能建立许多不同的生成树,每一棵生成树都可以是一个通信网。我们要选择一棵生成树,使总的耗费最小。

1.2该无向连通图的建立需要使用两种存储结构,即邻接表和邻接矩阵。

1.3实现最小生成树需要使用两种算法。即普里姆算法和克鲁斯卡尔。

1.4程序通过人机交互实现数据的输入和输出。

1.5测试数据

(a,b):2 ; (a,c):3; (a,d):4; (c,d):4; (b,d):5

二、概要设计

程序分为两大部分存储部分和算法部分;存储部分分为邻接矩阵和邻接表,而且包含了两者直接的互相转换;算法部分分为普里母算法和克鲁斯卡尔算法。

1.抽象数据类型图的定义如下

ADT Graph{

数据对象V;V是具有相同特性的数据元素的集合,成为顶点集。

数据关系R:

R = {VR}

VR = {(v,w)|v,w为V集合中的元素,(v,w)表示v和w之间存在

的路径}

基本操作P;

CreateMGraph(MGraph *G)

初始条件:V是图的顶点集,VR是图的边的集合。

操作结果:按V和VR的定义构造图G,用邻接矩阵存储。

CreateALGraph(ALGraph *G)

初始条件:V是图的顶点集,VR是图的边的集合。

操作结果:按V和VR的定义构造图G,用邻接表存储。

LocateVex(G,u)

初始条件:图G存在,u和G中顶点有相同的特征。

操作结果:若G中存在顶点u,则返回该顶点在图中的位置;否则返回其他信息。

MiniSpanTree_PRIM(G, u)

初始条件:图G存在,u是图G中的一个顶点。

操作结果:用普利姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边。

Kriuskal(G)

初始条件:图G存在

操作结果:用克鲁斯卡尔算法构造图G的最小生成树T,输出T的各条边。

ListToMat(MGraph *G1,ALGraph *G2)

初始条件:图G2存在

操作结果:把图的邻接表存储结构转换为邻接矩阵存储结构,用图G1表示。

MatToList(MGraph *G1,ALGraph *G2)

初始条件:图G1存在

操作结果:把图的邻接矩阵存储结构转换为邻接表存储结构,用图G2表示。

LocateVex(MGraph *G,VertexType u)

初始条件:图G存在,u和G中顶点有相同特征

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

}ADT Graph

2.主程序

void main()

{

创建图G,并按不同的存储结构输出。

对图的存储结构进行转换

使用算法构造最小生成树并输出各边

}

3.模块间的调用关系

主模块

子模块

三、详细设计

1.图和顶点的定义

#define OK 1

#define ERROR 0

#define TURE 1

#define FALSE 0

#define OVERFLOW -1

#define INFEASIBLE -2

typedef int Status;

#define INFINITY 32767 //两地之间没有架设线路的权值为最大数。#define MAX_VERTEX_NUM 20 //城市的数目最大为20

#define MAX_NAME 5//城市名称的最大长度为5

typedef char VertexType[MAX_NAME];//城市的名称用字符数组存储typedef int VRType; //两城市间的关系类型

1.1邻接矩阵存储表示的图的结构体类型的定义

typedef struct ArcCell

{

VRType adj;

/*顶点关系类型。对无权图,用1(是)或0(否)表示相邻否*/

/*对带权全图,则为权值类型*/

}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct

{

VertexType vexs[MAX_VERTEX_NUM]; /*顶点向量*/

AdjMatrix arcs; /*邻接矩阵*/

int vexnum,arcnum; /*图的当前顶点数和弧数*/

}MGraph;

1.2邻接表类型存储表示的图的结构体类型的定义

typedef struct ANode /* 弧的结点结构类型 */

{ int end; //弧尾在邻接表头结点中的位置

int begin; //弧头在邻接表头结点中的位置

int weight; /* 该弧的相关信息,这里用于存放权值 */ struct ANode *nextarc; /* 指向下一条弧的指针 */

} ANode;

typedef struct Vnode /* 邻接表头结点的类型 */

{ VertexType vertex; /* 顶点信息,城市名称 */

int bianhao; //城市在邻接表头结点数组中的相应编号

ANode *firstarc; /* 指向第一条弧 */

} VNode,AdjList[MAX_VERTEX_NUM]; /* AdjList是邻接表类型 */

typedef struct

{ AdjList adjlist; /* 邻接表 */

int vexnum,arcnum; /* 图中顶点数n和边数e */

} ALGraph;

2.Prim算法的思想

假设V是图中顶点的集合,E是图中边的集合,TE为最小生成树中的边的集合,则prim算法通过以下步骤可以得到最小生成树:

(1)初始化:U={u 0},TE={f}。此步骤设立一个只有结点u 0的结点集U

和一个空的边集TE作为最小生成树的初始形态,在随后的算法执行中,这个形态会不断的发生变化,直到得到最小生成树为止。

(2)在所有u∈U,v∈V-U的边(u,v)∈E中,找一条权最小的边(u 0,v 0),将此边加进集合TE中,并将此边的非U中顶点加入U中。此步骤的功能是在边集E中找一条边,要求这条边满足以下条件:首先边的两个顶点要分别在顶点集合U和V-U中,其次边的权要最小。找到这条边以后,把这条边放到边集TE中,并把这条边上不在U中的那个顶点加入到U中。这一步骤在算法中应执行多次,每执行一次,集合TE和U都将发生变化,分别增加一条边和一个顶点,因此,TE和U是两个动态的集合,这一点在理解算法时要密切注意。

(3)如果U=V,则算法结束;否则重复步骤2。可以把本步骤看成循环终止条件。我们可以算出当U=V时,步骤2共执行了n-1次(设n为图中顶点的数目),TE中也增加了n-1条边,这n-1条边就是需要求出的最小生成树的边。

Prim算法假设网中有N个顶点,则第一个进行初始化的循环语句频度为n,第二个循环语句的频度为n-1。其中有两个内循环;由此普里母算法的时间复杂度为O(n2),与网中的边数无关!

3.克鲁斯卡尔算法的思想为

假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:

(1)先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林。(2)从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。

(3)依次类推,重复上述操作,直至森林中只有一棵树,也即子图中含有n-1条边为止。

克鲁斯卡尔算法至多对e条边各扫描一次时间复杂度为O(eloge)。

4.编写程序使用到的函数为

(a)程序中用来实现邻接矩阵和邻接表存储、输出以及互相转化的函数

Status InitALGraph(ALGraph *G)

//初始化邻接表

void CreateALGraph(ALGraph *G)

//创建邻接表

Status InitMGraph(MGraph *G)

//初始化邻接表

Status CreateMGraph(MGraph *G)

//创建邻接表

Status MatToList(MGraph *G1,ALGraph *G2)

//将邻接矩阵G1转换成邻接表G2

Status ListToMat(MGraph *G1,ALGraph *G2)

//将邻接表G1转换成邻接矩阵G2

Status PrintMGraph(MGraph *G)

//输出邻接矩阵g

Status PrintALGraph(ALGraph *G){

//输出邻接表G

(b)程序中用来完成prim和kriuskal算法的函数

int mininum(minside closedge,MGraph *G)

// 求closedege数组中lowcost的最小正值

void MiniSpanTree_PRIM(MGraph *G,VertexType u)

// 用普利姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边void InsertSort(EdgeType E[],int n)

//对E[0...n-1]按权值递增有序的进行直接插入排序

void Kriuskal(ALGraph *G)

//克鲁斯卡尔算法

(c) 查找顶点U在图中的位置

int LocateVex(MGraph *G,VertexType u)

//查找顶点U在图中的位置

5.主函数模块为:

void main()

{

定义邻接矩阵存储结构的图;

定义邻接表存储结构的图;

选择一种存储结构画出图,并输出;

邻接矩阵和邻接表相互转化,得到两种类型的存储图,并输出转换后的图;

选择一种算法得到最小生成树并输出生成树的各边。

6.模块间的调用层次

四、编码与测试

这个阶段主要是对代码的编写及代码正确性的检验。通过前面的详细设计的分析,这个阶段是完成各个函数的功能, 在编程的过程中出现了许多的错误,导致功能的无法实现,出现的错误主要有及心的: 1.对于结构体的成员的调用 心得:结构体变量名调用函数时使用符号‘.’,对于结构体指针使用符号‘->’或者是先使用’*’取得变量名在使用‘.’调用成员。 2.函数调用时指针的传递 心得:这个主要是C++与C 语言的区别,在C++中函数的参数中有‘&’,表示该变量为返回值数据,而在C 语言中,据我所学确没有这样的用法。

3.非法字符的使用

心的:非法字符的使用往往让人很难找到错误,而且Win-TC 环境给出的提示往往是错误的。产生这种错误的原因是汉语的标识符的出现,往后要注意了。

4.字符串的输入及输出

心的:对于字符串的输入输出都应使用取地址符号。

5.数据的输入

心的:数据的输入可以使用空格符或取地址符号,但是空格符的输入常常容易发生错误,最好使用换行符。

6.程序的输出出现错误的数据

心的:程序总是会莫名奇妙的输出错误的信息,有时候输出是错误的,有时候是正确的,很奇怪,建议以后出现这类型情况时先看代码,若没有错误,那就等会再运行一边。

main() void CreateALGraph(ALGraph *G) Status CreateMGraph(MGraph *G) Status MatToList(MGraph *G1,ALGraph *G2) Status ListToMat(MGraph *G1,ALGraph *G2) void MiniSpanTree_PRIM(MGraph *G,VertexType u) void Kriuskal(ALGraph *G)

Status InitALGraph(ALGraph *G) Status InitMGraph(MGraph *G) Status PrintMGraph(MGraph *G) Status PrintALGraph(ALGraph *G) int mininum(minside closedge,MGraph *G) void InsertSort(EdgeType E[],int n) int LocateVex(MGraph *G,VertexType u)

7.命令行的消失

心的:有时候在输入数据的过程中,命令行就会突然消失,在同学的建议下加了getchar();语句就不出现这类情况了,不明白是为什么。

8.命令行重复输出相同的数据

心的:这种情况很有可能是出现了死循环,这不仅发生在循环语句的情况下,对于结点指针的指向也会导致是循环。

五、综合测试

综合测试其实是对程序的总体测试,但在编码阶段已经对语句的进行了测试,在总体测试阶段多采用几组数据,在编码阶段的数据可以简单一些,但在综合测试阶段要用使用比较复杂的数据,可以检测到在编码阶段不宜发现的错误。

在综合测试阶段发现的错误:对于邻接表的指针的取向。

测试数据:

(a,b):2 ; (a,c):3; (a,d):4; (c,d):4; (b,d):5

采用邻接表存储的输入及邻接表转换为邻接矩阵并显示

通过Prim算法显示最小生成树的各边

采用邻接矩阵存储的输入

邻接矩阵转换为邻接表并显示及通过Prim算法显示最小生成树的各边

通过Kruskal算法显示最小生成数的各边

六、课程总结

认识:

对于编程,假期一个月的学习里,我已经有了很深刻的体会,搭建框架是十分必要的,只有有了框架才能在具体实现上一步一步的完成。

通过这次的课程设计,不仅让我提高了编写程序的能力,同时也让我对大学所学课本的知识有了更好的

这学期,我学习了软件工程导论,这门课程主要是对编写软件过程的顺序的介绍,不同的阶段应该完成什么样的任务。按着书上的步骤一步步完成,确实很节省时间。数据结构

对于建立n地最小生成树问题是将数据结构的知识运用于实现现实问题,在程序设计过程中对于我来说十分繁杂,在具体实现算法是出现了问题:例如prim 算法实现的时候没有办法记录起始点,再输出边的过程中出现错误,经过上网查阅资料才建立了数组将其解决。再调试程序过程中也是相当繁琐,代码写完了但是运行过程中出现了很多错误。

编写程序是一件幸苦但又愉快的过程,在学完C语言是并没有什么太多的算法思想,但数据结构给了我很多灵感,有了数据结构的思想很多实际问题就能解

决了,主要由于代码接触太少,所以在有了思想的情况下很难实现代码,以后要经常去用代码实现自己的想法,算法对于程序设计十分重要,数据结构可以说是编程者的大脑,没有数据结构代码就失去了运用于实际问题的能力。

心得:

在课程设计的过程中收获很多,独立思考是我首先觉悟到的,因为起初在看到繁杂的代码满脑子只有愤怒,自己根本没有办法实现,可后来在经过上网查阅思想和数据结构书我才慢慢的有了自己的想法。最后渐渐的喜欢上了代码,课程设计的确让我有一种成为编程人员的感觉了,经过努力我终于完成了本次课程设计,通过这次课程设计,我感觉到要真正做出一个程序并不很容易,但只要用心去做,总会有收获,特别是当我遇到一个问题,想办法去解决,最后终于找到方法时,心里的那份喜悦之情真是难以形容。编写程序中遇到问题再所难免,应耐心探究其中的原因,从出现问题的地方起,并联系前后程序,仔细推敲,逐个排查。直到最终搞清为止。我们本次做的是图的做小生成树问题,深刻的体会到它的实用性。通过本次课程设计我们发现我们对于C语言和数据结构还有很多地方不知道,今后需要努力学习。

-------------------------------------------------------------------------------------------------------

参考文献:

[1] 李云清,杨庆红.数据结构(C语言版).北京:人民邮电出版社,2004.

[2] 严蔚敏,吴伟民.数据结构(C语言版).北京:清华大学出版.1997.

[3] 苏光奎,李春葆.数据结构导学.北京:清华大学出版.2002.

[4] 周海英,马巧梅,靳雁霞.数据结构与算法设计.北京:国防工业出版社,2007.

[5] 张海藩. 软件工程导论. 北京:清华大学出版社.2003.

[6]互联网

附录:程序清单

#include

#include

#define OK 1

#define ERROR 0

#define TURE 1

#define FALSE 0

#define OVERFLOW -1

#define INFEASIBLE -2

typedef int Status;

#define INFINITY 32767

#define MAX_VERTEX_NUM 20

#define MAX_NAME 5

typedef char VertexType[MAX_NAME];

typedef int VRType;

typedef struct ArcCell

{

VRType adj;

/*顶点关系类型。对无权图,用1(是)或0(否)表示相邻否*/

/*对带权全图,则为权值类型*/

}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct

{

VertexType vexs[MAX_VERTEX_NUM];

/*顶点向量*/

AdjMatrix arcs;

/*邻接矩阵*/

int vexnum,arcnum;

/*图的当前顶点数和弧数*/

}MGraph;

/* 以下定义邻接表类型 */

typedef struct ANode /* 弧的结点结构类型 */

{ int end;

int begin; /* 该弧的终点位置 */

int weight; /* 该弧的相关信息,这里用于存放权值 */ struct ANode *nextarc; /* 指向下一条弧的指针 */

} ANode;

typedef struct Vnode /* 邻接表头结点的类型 */

{ VertexType vertex; /* 顶点信息 */

int bianhao;

ANode *firstarc; /* 指向第一条弧 */

} VNode,AdjList[MAX_VERTEX_NUM]; /* AdjList是邻接表类型 */ typedef struct

{ AdjList adjlist; /* 邻接表 */

int vexnum,arcnum; /* 图中顶点数n和边数e */ } ALGraph; /* 图的邻接表类型 */

int LocateVex(MGraph *G,VertexType u)

{ /*初始条件:图G存在,u和G中顶点有相同特征*/

/*操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1*/ int i;

for(i=0;ivexnum;++i)

if(strcmp(u,G->vexs[i])==0)

return i;

return -1;

}

/* 建立无向图的邻接表算法 */

Status InitALGraph(ALGraph *G){

int i ;

printf("请输入城市的数量及城市间的路径数目\n");

scanf("%d%d",&G->vexnum,&G->arcnum);

for(i=0;i vexnum;i++)

{/* 建立顶点表 */

printf("请输入第%d个城市的名称\n",i);

scanf("%s",&G->adjlist[i].vertex); /* 读入顶点信息 */

G->adjlist[i].firstarc=NULL;/* 边表置为空表 */

G->adjlist[i].bianhao = i;

}

printf("每个城市所对应的序号为\n");

for(i = 0;ivexnum;i++)

{

printf("%d--->%s ",i,&G->adjlist[i].vertex);

}

return OK;

}

Status PrintALGraph(ALGraph *G){

int i,end,begin,weight;

ANode *s;

for(i=0;ivexnum;i++){/* 建立顶点表 */

printf("%s ------>",&G->adjlist[i].vertex);

s = G->adjlist[i].firstarc;

while(s!=NULL)

{

printf("( %s,%s ):%d ",&G->adjlist[s->end].vertex,&G->adjlist[s->begin].vertex,s->weight); s = s->nextarc;

}

printf("\n");

}

return OK;

}

void CreateALGraph(ALGraph *G)

{

int i,j,k,weight;

ANode *s;

InitALGraph (G);

for(k=0;k< G-> arcnum;k++){ /* 建立边表 */

printf("请输入第%d条边的两个城市的编号及路径的架设费用\n",k);

scanf("%d",&i);

scanf("%d",&j);

scanf( "%d",&weight);/* 读入边(vi,vj)的顶点对序号 */

s=( ANode *)malloc(sizeof(ANode)); /* 生成边表结点 */

if(!s) {

printf("申请空间失败!\n");

exit(OVERFLOW);

}

s-> begin=j; /* 邻接点序号为j */

s->end = i;

s->weight = weight;

s->nextarc= G->adjlist[i].firstarc;

G->adjlist[i].firstarc=s; /* 将新结点*s插入顶点vi的边表头部*/

s=(ANode*)malloc(sizeof(ANode));

if(!s) {

printf("申请空间失败!\n");

exit(OVERFLOW);

}

s-> begin=i; /* 邻接点序号为i */

s->end = j;

s->weight = weight;

s->nextarc=G->adjlist[j].firstarc;

G->adjlist[j].firstarc=s; /* 将新结点*s插入顶点vj的边表头

部 */

}

PrintALGraph(G);

}/* CreateALGraph */

Status PrintMGraph(MGraph *G){

int a;

int i,j;

printf(" ");

for(i=0;ivexnum;++i)

printf(" %s ",&G->vexs[i]);

printf("\n");

for ( i=0; ivexnum; i++)

{

printf(" %s ",&G->vexs[i]);

for ( j=0; jvexnum; j++)

{

printf(" %5d ",G->arcs[i][j].adj);

}

printf("\n");

}

return OK;

}

Status InitMGraph(MGraph *G){

int i,j;

printf("请输入城市的数量及城市间的路径数目\n"); scanf("%d%d",&G->vexnum,&G->arcnum);

printf("\n请依次输入城市的名称,字符串类型\n"); for(i=0;ivexnum;++i)

{

/*构造顶点向量*/

scanf("%s",&G->vexs[i]);

}

for(i=0;ivexnum;++i)

/*初始化邻接矩阵*/

for(j=0;jvexnum;++j)

G->arcs[i][j].adj=INFINITY;

return OK;

}

Status CreateMGraph(MGraph *G)

{/*采用数组(邻接矩阵)表示法,构造无向网G*/

int i,j,k,weight,IncInfo;

VertexType va,vb;

InitMGraph(G);

for(k=0;karcnum;++k)

{ printf("请输入第%d条路径的起点城市和终点城市的名称及路径的架设费用\n",k);

scanf("%s %s %d",&va,&vb,&weight);

i=LocateVex(G,va);

j=LocateVex(G,vb);

G->arcs[i][j].adj=weight;

G->arcs[j][i].adj=weight;

}

PrintMGraph(G);

return OK;

}

typedef struct

{/*记录从顶点集U到V-U的代价最小的边的辅助数组定义*/

VertexType adjvex;

VRType lowcost;

}minside[MAX_VERTEX_NUM];

int mininum(minside closedge,MGraph *G)

{/*求closedege,lowcost的最小正值*/

int i=0,j,k,min;

while(!closedge[i].lowcost)

i++;

min=closedge[i].lowcost;

k=i;

for(j=i+1;jvexnum;j++)

if(closedge[j].lowcost>0)

if(min>closedge[j].lowcost)

{

min=closedge[j].lowcost;

k=j;

}

return k;

}

void MiniSpanTree_PRIM(MGraph *G,VertexType u)

{/*用普利姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边*/

int i,j,k;

int qidian,zhongdian,weight;

VertexType va,vb;

minside closedge;

k=LocateVex(G,u);

for(j=0;jvexnum;++j)

/*辅助数组初始化*/

{

if(j!=k)

{

strcpy(closedge[j].adjvex,u);

closedge[j].lowcost=G->arcs[k][j].adj;

}

}

closedge[k].lowcost=0;

/*初始U={u}*/

printf("最小代价生成树的各条边为:\n");

for(i=1;ivexnum;++i)

{/*选择其余G.vexnum-1个顶点*/

k=mininum(closedge,G);

/*求出T的下一个结点:第K顶点*/

strcpy( va,closedge[k].adjvex);

strcpy(vb ,G->vexs[k]);

qidian=LocateVex(G,va);

zhongdian=LocateVex(G,vb);

weight = G->arcs[qidian][zhongdian].adj;

printf("weight(%s,%s)=%d\n",va,vb,weight);

/*输出生成树的边*/

closedge[k].lowcost=0;

/*第K顶点并入U集*/

for(j=0;jvexnum;++j)

if(G->arcs[k][j].adj

{/*新顶点并入U集后重新选择最小边*/

strcpy(closedge[j].adjvex,G->vexs[k]);

closedge[j].lowcost=G->arcs[k][j].adj;

}

}

}

void InsertSort(ANode *E,int n)/* 对E[0...n-1]按权值递增有序的进行直接插入排序 */

{

int i,j;

ANode temp;

for(i=1;i<=n;i++)

{

temp=E[i];

j=i-1;

while(j>=0&&temp.weight

{

E[j+1]=E[j];/* 将w大于E[i].w的记录后移 */

j--;

}

E[j+1]=temp;/* 在j+1处插入E[i] */

}

}

void Kriuskal(ALGraph *G)

{

ANode *E;

ANode *s;

int i,j,end,begin,sn1,sn2,k,n;

int vset[MAX_VERTEX_NUM];

n = 2*G->vexnum;

E=(struct ANode*)malloc(n*sizeof(struct ANode));

k=0;

for(i=0;ivexnum;i++)

{

/* 将各边存到E[0...n]数组中 */

for(j=0;jvexnum;j++)

s = G->adjlist[i].firstarc;

while(s!=NULL)

{

(E+k)->end = s->end;

(E+k)->begin = s->begin;

(E+k)->weight = s->weight ;

s = s->nextarc;

k++;

}

}

InsertSort(E,k); /* 对E数组按w递增排序 */

for(i=0;ivexnum;i++)

vset[i]=i; /* 初始化辅助数组 */

k=1;

j=0;

while(kvexnum) /* 生成的边数小于n时循环 */ {

end=(E+j)->end;

begin=(E+j)->begin; /* 取一条边的头尾顶点 */

sn1=vset[end];

sn2=vset[begin];/* 分别得到两个顶点所属的集合编号 */

if(sn1!=sn2) /* 两顶点属不同集合,则该边是最小生成树的一条边 */

{

printf( "weight(%s %s) : %d\n",&(G->adjlist[end].vertex),&(G->adjlist [begin].vertex),(E+j)->weight);

k++; /* 生成边数增1 */

for(i=0;i

if(vset[i]==sn2)

vset[i]=sn1;

}

j++; /* 扫描下一条边 */

}

}

Status SelectSaveStructure(){

int c;

printf("请选择一种算法存储无向图\n");

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

printf(" ########邻接矩阵: 1 #######邻接表: 2\n");

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

printf("请按键选择: ");

while(1){

scanf("%d",&c);

if(c==1||c==2) break;

else {

printf("输入的数字不符合要求,请从新输入\n");

}

}

getchar();

return c;

}

Status SelectSuanFa(){

int c;

printf("请选择一种算法构建最小生成树\n");

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

printf(" ########普里姆算法(Prim): 1 #######和克鲁斯卡尔算法(Kruskal): 2\n");

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

printf("请按键选择: ");

while(1){

scanf("%d",&c);

if(c==1||c==2) break;

else {

printf("输入的数字不符合要求,请从新输入\n");

}

}

getchar();

return c;

}

Status ListToMat(MGraph *G1,ALGraph *G2){

int i,j;

ANode *s;

for(i = 0;ivexnum;i++){

strcpy(G1->vexs[i], G2->adjlist[i].vertex);

for(j = 0;jvexnum;j++)

{

G1->arcs[i][j].adj = INFINITY;

}

}

for(i = 0;ivexnum;i++)

{

s = G2->adjlist[i].firstarc;

while(s){

G1->arcs[s->end][s->begin].adj = s->weight;

s =s->nextarc;

}

}

G1->vexnum = G2->vexnum;

G1->arcnum = G2->arcnum;

PrintMGraph(G1);

return OK;

}

Status MatToList(MGraph *G1,ALGraph *G2)

{

int i,j;

ANode *s,*temp;

for(i = 0;ivexnum;i++)

{

strcpy( G2->adjlist[i].vertex ,G1->vexs[i]);

G2->adjlist[i].firstarc = NULL;

}

for(i = 0;ivexnum;i++)

{

for(j = 0;jvexnum;j++)

{

if(G1->arcs[i][j].adj!=INFINITY)

{

s = (struct ANode*)malloc(sizeof(struct ANode)); s->end = i;

s->begin = j;

s->weight = G1->arcs[i][j].adj;

s->nextarc=NULL;

if(G2->adjlist[i].firstarc==NULL){

G2->adjlist[i].firstarc = s;

}else{

s->nextarc = G2->adjlist[i].firstarc;

G2->adjlist[i].firstarc = s;

}

}

}

数据结构课程设计参考题目

数据结构课程设计题目 数据结构课程设计题目(大题目).doc 一、公司销售管理系统 项目开发基本要求 1.客户信息管理:对客户的基本信息进行添加、修改和删除。 2.产品信息管理:对产品的基本信息进行添加、修改和删除。 3.供应商信息管理:对供应商的基本信息进行添加、修改和删除。 4.订单信息管理:对订单的基本信息进行添加、修改和删除。 二、高校科研管理系统 系统主要用于帮助高校或科研单位管理和维护各项科研相关资料 项目开发基本要求 1.系统用户管理模块:为系统新用户设置用户名及口令;操作员更改自己的系统口令。2.数据字典管理模块:管理项目性质包括:分为国家自然科学基金、863、部省科委及企业集团四种情况;范围包括:分为全国、国际、地方三种情况;检索源包括:分为EI、SCI、核心和一般四种情况。 3.项目参加人员管理模块包括:显示添加修改删除查询。 4.项目基本情况模块包括:显示添加修改删除查询。 5.项目获奖情况模块包括:显示添加修改删除查询。 6.期刊论文管理模块包括:显示添加修改删除查询。 7.著作管理模块包括:显示添加修改删除查询。 8.科研工作量统计模块:按照学校科研工作量计算办法,为每位科研人员进行科研工作量的计算和统计。 9.科研积分统计模块:按照学校科研积分计算办法,为每位科研人员进行科研计分的计算和统计。 三、网络五子棋对战 四、不同排序算法模拟 五、科学计算器 数据结构课程设计题目 1.运动会分数统计 任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n< =20) 功能要求: 1)可以输入各个项目的前三名或前五名的成绩; 2)能统计各学校总分,

数据结构课程设计报告模板

《数据结构I》三级项目报告 大连东软信息学院 电子工程系 ××××年××月

三级项目报告注意事项 1. 按照项目要求书写项目报告,条理清晰,数据准确; 2. 项目报告严禁抄袭,如发现抄袭的情况,则抄袭者与被抄袭者均 以0分计; 3. 课程结束后报告上交教师,并进行考核与存档。 三级项目报告格式规范 1. 正文:宋体,小四号,首行缩进2字符,1.5倍行距,段前段后 各0行; 2. 图表:居中,图名用五号字,中文用宋体,英文用“Times New Roman”,位于图表下方,须全文统一。

目录 一项目设计方案 (3) 二项目设计分析 (4) 三项目设计成果 (4) 四项目创新创业 (5) 五项目展望 (6) 附录一:项目成员 (6) 附录二:相关代码、电路图等 (6)

一项目设计方案 1、项目名称: 垃圾回收 2、项目要求及系统基本功能: 1)利用数据结构的知识独立完成一个应用系统设计 2)程序正常运行,能够实现基本的数据增加、删除、修改、查询等功能3)体现程序实现算法复杂度优化 4)体现程序的健壮性 二项目设计分析 1、系统预期实现基本功能: (结合本系统预期具体实现,描述出对应基本要求(增、删、改、查等)的具体功能) 1. 2. 3. 4. 5. 6. 7. 2、项目模块功能描述 (基本分为组织实施组织、程序功能模块编写、系统说明撰写等。其中程序功能子模块实现) 模块一: 主要任务:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 模块二: 主要任务:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 模块n: 主要任务:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

数据结构实验总结报告

数据结构实验总结报告 一、调试过程中遇到哪些问题? (1)在二叉树的调试中,从广义表生成二叉树的模块花了较多时间调试。 由于一开始设计的广义表的字符串表示没有思考清晰,处理只有一个孩子的节点时发生了混乱。调试之初不以为是设计的问题,从而在代码上花了不少时间调试。 目前的设计是: Tree = Identifier(Node,Node) Node = Identifier | () | Tree Identifier = ASCII Character 例子:a(b((),f),c(d,e)) 这样便消除了歧义,保证只有一个孩子的节点和叶节点的处理中不存在问题。 (2)Huffman树的调试花了较长时间。Huffman编码本身并不难处理,麻烦的是输入输出。①Huffman编码后的文件是按位存储的,因此需要位运算。 ②文件结尾要刷新缓冲区,这里容易引发边界错误。 在实际编程时,首先编写了屏幕输入输出(用0、1表示二进制位)的版本,然后再加入二进制文件的读写模块。主要调试时间在后者。 二、要让演示版压缩程序具有实用性,哪些地方有待改进? (1)压缩文件的最后一字节问题。 压缩文件的最后一字节不一定对齐到字节边界,因此可能有几个多余的0,而这些多余的0可能恰好构成一个Huffman编码。解码程序无法获知这个编码是否属于源文件的一部分。因此有的文件解压后末尾可能出现一个多余的字节。 解决方案: ①在压缩文件头部写入源文件的总长度(字节数)。需要四个字节来存储这个信息(假定文件长度不超过4GB)。 ②增加第257个字符(在一个字节的0~255之外)用于EOF。对于较长的文件,

会造成较大的损耗。 ③在压缩文件头写入源文件的总长度%256的值,需要一个字节。由于最后一个字节存在或不存在会影响文件总长%256的值,因此可以根据这个值判断整个压缩文件的最后一字节末尾的0是否在源文件中存在。 (2)压缩程序的效率问题。 在编写压缩解压程序时 ①编写了屏幕输入输出的版本 ②将输入输出语句用位运算封装成一次一个字节的文件输入输出版本 ③为提高输入输出效率,减少系统调用次数,增加了8KB的输入输出缓存窗口 这样一来,每写一位二进制位,就要在内部进行两次函数调用。如果将这些代码合并起来,再针对位运算进行一些优化,显然不利于代码的可读性,但对程序的执行速度将有一定提高。 (3)程序界面更加人性化。 Huffman Tree Demo (C) 2011-12-16 boj Usage: huffman [-c file] [-u file] output_file -c Compress file. e.g. huffman -c test.txt test.huff -u Uncompress file. e.g. huffman -u test.huff test.txt 目前的程序提示如上所示。如果要求实用性,可以考虑加入其他人性化的功能。 三、调研常用的压缩算法,对这些算法进行比较分析 (一)无损压缩算法 ①RLE RLE又叫Run Length Encoding,是一个针对无损压缩的非常简单的算法。它用重复字节和重复的次数来简单描述来代替重复的字节。尽管简单并且对于通常的压缩非常低效,但它有的时候却非常有用(例如,JPEG就使用它)。 变体1:重复次数+字符 文本字符串:A A A B B B C C C C D D D D,编码后得到:3 A 3 B 4 C 4 D。

数据结构课程设计报告模板

课程设计说明书 课程名称:数据结构 专业:班级: 姓名:学号: 指导教师:成绩: 完成日期:年月日

任务书 题目:黑白棋系统 设计内容及要求: 1.课程设计任务内容 通过玩家与电脑双方的交替下棋,在一个8行8列的方格中,进行棋子的相互交替翻转。反复循环下棋,最后让双方的棋子填满整个方格。再根据循环遍历方格程序,判断玩家与电脑双方的棋子数。进行大小判断,最红给出胜负的一方。并根据y/n选项,判断是否要进行下一局的游戏。 2.课程设计要求 实现黑白两色棋子的对峙 开发环境:vc++6.0 实现目标: (1)熟悉的运用c语言程序编写代码。 (2)能够理清整个程序的运行过程并绘画流程图 (3)了解如何定义局部变量和整体变量; (4)学会上机调试程序,发现问题,并解决 (5)学习使用C++程序来了解游戏原理。 (6)学习用文档书写程序说明

摘要 本文的研究工作在于利用计算机模拟人脑进行下黑白棋,计算机下棋是人工智能领域中的一个研究热点,多年以来,随着计算机技术和人工智能技术的不断发展,计算机下棋的水平得到了长足的进步 该程序的最终胜负是由棋盘上岗双方的棋子的个数来判断的,多的一方为胜,少的一方为负。所以该程序主要运用的战术有削弱对手行动战术、四角优先战术、在游戏开局和中局时,程序采用削弱对手行动力战术,即尽量减少对手能够落子的位置;在游戏终局时则采用最大贪吃战术,即尽可能多的吃掉对手的棋子;而四角优先战术则是贯穿游戏的始终,棋盘的四角围稳定角,不会被对手吃掉,所以这里是兵家的必争之地,在阻止对手进角的同时,自己却又要努力的进角。 关键词:黑白棋;编程;设计

数据结构课程设计报告

《数据结构与算法》课程设计报告 学号: 班级序号: 姓名: 指导教师: 成绩: 中国地质大学信息工程学院地理信息系统系 2011年12 月

1.需求规格说明 【问题描述】 利用哈夫曼编码进行对已有文件进行重新编码可以大大提高减小文件大小,减少存储空间。但是,这要求在首先对一个现有文件进行编码行成新的文件,也就是压缩。在文件使用时,再对压缩文件进行解压缩,也就是译码,复原原有文件。试为完成此功能,写一个压缩/解压缩软件。 【基本要求】 一个完整的系统应具有以下功能: (1)压缩准备。读取指定被压缩文件,对文件进行分析,建立哈夫曼树,并给出分析结果(包括数据集大小,每个数据的权值,压缩前后文件的大小),在屏幕上输出。 (2)压缩。利用已建好的哈夫曼树,对文件进行编码,并将哈夫曼编码及文件编码后的数据一起写入文件中,形成压缩文件(*.Haf)。 (3)解压缩。打开已有压缩文件(*.Haf),读取其中的哈夫曼编码,构建哈夫曼树,读取其中的数据,进行译码后,写入文件,完成解压缩。 (4)程序使用命令行方式运行 压缩命令:SZip A Test.Haf 1.doc 解压缩命令:SZip X Test.Haf 2.doc或SZip X Test.Haf 用户输入的命令不正确时,给出提示。 (5)使用面向对象的思想编程,压缩/解压缩、哈夫曼构建功能分别构建类实现。 2.总体分析与设计 (1)设计思想: 1、压缩准备:1> 读文件,逐个读取字符,统计频率 2> 建立哈夫曼树 3> 获得哈弗曼编码 2、压缩过程: 1> 建立一个新文件,将储存权值和字符的对象数组取存储在文件头

数据结构课程设计题目选择

数据结构课程设计题目 说明: (1)选用语言:C或Java语言; (2)需要注明3人(可少于3人)小组各自承担和完成的任务(据此给予成绩); (3)如下带“*”的题目,“*”越多,难度越大一些,分值权重更高---要得到更高分数,推荐选择。 要求: (1) 用中文给出设计说明书(含重要子函数的流程图); (2) 给出测试通过、能实现相应功能的源代码; (3) 测试报告。 0、小学数学四则混合运算试题出题、评价、题库自动生成与组卷系统(****)---已经有2组选择 任务: (1)将随机给出的四则混合运算表达式显示在计算机显示器上,要求应试者给出答案;并且使用堆栈对该表达式求值,同给出的答案进行比较,判断 正确和错误。给出鼓励信息和嘉奖信息; (2)保存多人在不同时间应试的题目与他(或她)给出的答案,评价所出题目的难易程度(通过多人回答正确与否的情况给出),形成题库; (3)按照用户给出的题目难易程度指标(例如让50人的得分满足怎样的正态分布,如90分以上10%,80分以上30%,70分以上30%,60分以上20%,60分 以下10%),从题库中抽取不同的题目,组成试卷。 要求:随机产生的题目中,参加运算的数据随机、运算符随机。题目涉及加减乘除,带括弧的混合运算;随时可以退出;保留历史分数,能回顾历史,给出与历史分数比较后的评价。 1、集合的并、交和差运算---已经有1组选择 任务:编制一个能演示执行集合的并、交和差运算的程序。 要求: (1) 集合的元素限定为小写字母字符[…a?..?z?] 。 (2) 演示程序以用户和计算机的对话方式执行。 实现提示:以链表表示集合。 选作内容: (1) 集合的元素判定和子集判定运算。 (2) 求集合的补集。 (3) 集合的混合运算表达式求值。 (4) 集合的元素类型推广到其他类型,甚至任意类型。 2、停车场管理------已经有2组选择 任务:设停车场是一个可以停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次有北向南排列(大门在最南端,最先到达的第一车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 要求:以栈模拟停车场,以队列模拟车场外的便道。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停车不收费)。栈以顺序存储结构实现,队列以链表结构实现。 3、哈夫曼码的编/译码系统(**)---已经有1组选择

数据结构课程设计(附代码)-数据结构设计说明

应用技术学院课程设计报告 课程名称《数据结构课程设计》 设计题目猴子选大王;建立二叉树;各种排序;有序表的合并;成绩管理系统;院系计算机科学与信息工程专业计算机科学与技术班级 学号指导教师日期 一.目的与要求 1. 巩固和加深对常见数据结构的理解和掌握 2. 掌握基于数据结构进行算法设计的基本方法 3. 掌握用高级语言实现算法的基本技能 4. 掌握书写程序设计说明文档的能力 5. 提高运用数据结构知识及高级语言解决非数值实际问题的能力 二.课程设计容说明 1. 项目一 (1) 对设计任务容的概述 学生成绩管理** 任务:要现对学生资料的录入、浏览、插入和删除等功能。 输入:设学生成绩以记录形式存储,每个学生记录包含的信息有:学号和各门课程的成绩,设学生成绩至少3门以上。存储结构:采用线性链式结构。 (2) 详细设计 LinkList *create():输入学生成绩记录函数; void print(LinkList *head):显示全部记录函数 LinkList *Delete(LinkList *head):删除记录函数 LinkList *Insert(LinkList *head):插入记录函数 void menu_select():菜单选择 void ScoreManage():函数界面 (3) 程序流程图

(4) 程序模块及其接口描述 该程序可以分为以下几个模块: 1、菜单选择:void menu_select(); 提供五种可以选择的操作,在main函数过switch语句调用菜单menu_select()函数,进入不同的功能函数中完成相关操作。 2、输入功能:LinkList *create(); 通过一个for循环语句的控制,可以一次完成无数条记录的输入。并将其存入链

数据结构课程设计独立题目

题目2:运动会分数统计 1.问题描述 参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1……m,女子m+1……m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20) 2.功能要求 1)可以输入各个项目的前三名或前五名的成绩; 2)能统计各学校总分; 3)可以按学校编号、学校总分、男女团体总分排序输出; 4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。 存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。 。 题目6:哈夫曼编/译码器 1.问题描述 利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼编/译码系统。 2.功能要求 I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。 E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件htmTree 中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile 中。 D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。 P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码写入文件CodePrint中。 T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint 中。 题目9:构造可以使n个城市连接的最小生成树 1.问题描述 给定一个地区的n个城市间的距离网,用Prim算法或Kruskal算法建立最小生成树,并计算得到的最小生成树的代价。 2.功能要求 城市间的距离网采用邻接矩阵表示,邻接矩阵的存储结构定义采用课本中给出的定义,若两个城市之间不存在道路,则将相应边的权值设为自己定义的无穷大值。要求在屏幕上显示得到的最小生成树中包括了哪些城市间的道路,并显示得到的最小生成树的代价。

数据结构课程设计题目及要求

实验一~实验四任选一题;实验五~实验九任选一题。 实验一运动会分数统计 一、实验目的: (1)熟练掌握线性表的两种存储方式 (2)掌握链表的操作和应用。 (3)掌握指针、结构体的应用 (4)按照不同的学校,不同项目和不同的名次要求,产生各学校的成绩单、团体总分报表。 二、实验内容: 【问题描述】 参加运动会的n个学校编号为1~n。比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w。由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;还有些项目只取前三名,得分顺序为5,3,2。写一个统计程序产生各种成绩单和得分报表。 【基本要求】 产生各学校的成绩单,内容包括各校所取得的每项成绩的项目号、名次(成绩)、姓名和得分;产生团体总分报表,内容包括校号、男子团体总分、女子团体总分和团体总分。 【测试数据】 对于n=4,m=3,w=2,编号为奇数的项目取前五名,编号为偶数的项目取前三名,设计一组实例数据。 【实现提示】 可以假设m≤20,m≤30,w≤20,姓名长度不超过20个字符。每个项目结束时,将其编号、类型符(区分取前五名还是前三名)输入,并按名次顺序输入运动员姓名、校名(和成绩)。 【选作内容】 允许用户指定某些项目可采取其他名次取法。

实验二停车场管理 一、实验目的: (1)熟练掌握栈顺存和链存两种存储方式。 (2)掌握栈的基本操作及应用。 (3)以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。 二、实验内容: 【问题描述】 设停车场是一个可停放n辆汽车的长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车信放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场院,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 【基本要求】 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。 【测试数据】 设n=2,输入数据为:(A,1,5),(A,1,15),(A,3,20),(A,4,25),(A,5,30),(D,2,35),(D,4,40),(E,0,0)。其中:A表示到达(Arrival);D表示离去(Departure);E表示输入结束(End)。 【实现提示】 需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。 【选作内容】 (1)两个栈共享空间,思考应开辟数组的空间是多少? (2)汽车可有不同种类,则他们的占地面积不同收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。(3)汽车可以直接从便道开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。 (4)停放在便道上的汽车也收费,收费标准比停放在停车场的车低,请思考如何修改结构以满足这种要求。

数据结构课程设计报告范例

Guangxi University of Science and Technology 课程设计报告 课程名称:算法与编程综合实习 课题名称: 姓名: 学号: 院系:计算机学院 专业班级:通信121 指导教师: 完成日期:2012年12月15日

目录 第1部分课程设计报告 (3) 第1章课程设计目的 (3) 第2章课程设计内容和要求 (4) 2.1 问题描述 (4) 2.2 设计要求 (4) 第3章课程设计总体方案及分析 (4) 3.1 问题分析 (4) 3.2 概要设计 (7) 3.3 详细设计 (7) 3.4 调试分析 (10) 3.5 测试结果 (10) 3.6 参考文献 (12) 第2部分课程设计总结 (13) 附录(源代码) (14)

第1部分课程设计报告 第1章课程设计目的 仅仅认识到队列是一种特殊的线性表是远远不够的,本次实习的目的在于使学生深入了解队列的特征,以便在实际问题背景下灵活运用它,同时还将巩固这种数据结构的构造方………………………………………………………………………………………………………………………………………………………………………………………..(省略)

第2章课程设计内容和要求 2.1问题描述: 迷宫问题是取自心理学的一个古典实验。在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒子中设置了许多墙,对行进方向形成了多处阻挡。盒子仅有一个出口,在出口处放置一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。对同一只老鼠重复进行上述实验,一直到老鼠从入口走到出口,而不走错一步。老鼠经过多次试验最终学会走通迷宫的路线。设计一个计算机程序对任意设定的矩形迷宫如下图A所示,求出一条从入口到出口的通路,或得出没有通路的结论。 图A 2.2设计要求: 要求设计程序输出如下: (1) 建立一个大小为m×n的任意迷宫(迷宫数据可由用户输入或由程序自动生成),并在屏 幕上显示出来; (2)找出一条通路的二元组(i,j)数据序列,(i,j)表示通路上某一点的坐标。 (3)用一种标志(如数字8)在迷宫中标出该条通路; (4)在屏幕上输出迷宫和通路; (5)上述功能可用菜单选择。

数据结构课程设计题目

《数据结构》课程设计题目 1. 排序算法的性能分析 问题描述 设计一个测试程序,比较几种内部排序算法的关键字比较次数和移动次数以取得直观感受。 基本要求 (1)对冒泡排序、直接排序、选择排序、箱子排序、堆排序、快速排序及归并排序算法进行比较。 (2)待排序表的表长不小于100,表中数据随机产生,至少用5组不同数据作比较,比较指标:关键字参加比较次数和关键字的移动次数(关键字交换记为3次移动)。 (3)输出比较结果。 选做内容 (1)对不同表长进行比较。 (2)验证各算法的稳定性。 (3)输出界面的优化。 2. 排序算法思想的可视化演示—1 基本要求 排序数据随机产生,针对随机案例,对冒泡排序、箱子排序、堆排序、归并算法,提供排序执行过程的动态图形演示。 3. 排序算法思想的可视化演示—2 基本要求 排序数据随机产生,针对随机案例,,对插入排序、选择排序、基数排序、快速排序算法,提供排序执行过程的动态图形演示。 4. 线性表的实现与分析 基本要求 ①设计并实现线性表。 ②线性表分别采取数组(公式化描述)、单链表、双向链表、间接寻址存储方 式 ③针对随机产生的线性表实例,实现线性表的插入、删除、搜索操作动态演示(图 形演示)。 5. 等价类实现及其应用 问题描述:某工厂有一台机器能够执行n个任务,任务i的释放时间为r i(是一个整数),最后期限为d i(也是整数)。在该机上完成每个任务都需要一个单元的时间。一种可行的调

度方案是为每个任务分配相应的时间段,使得任务i的时间段正好位于释放时间和最后期限之间。一个时间段不允许分配给多个任务。 基本要求: 使用等价类实现以上机器调度问题。 等价类分别采取两种数据结构实现。 6. 一元稀疏多项式计算器 问题描述 设计一个一元稀疏多项式简单计算器。 基本要求 一元稀疏多项式简单计算器的基本功能是: (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,…,c n,e n,其中n是多项式的项数,c i,e i,分别是第i项的系数和指数,序列按指数降序排序; (3)多项式a和b相加,建立多项式a+b; (4)多项式a和b相减,建立多项式a-b; (5)计算多项式在x处的值; (6)计算器的仿真界面(选做) 7. 长整数的代数计算 问题描述 应用线性数据结构解决长整数的计算问题。设计数据结构完成长整数的表示和存储,并编写算法来实现两长整数的加、减、乘、除等基本代数运算。 基本要求 ①长整数长度在一百位以上。 ②实现两长整数在取余操作下的加、减、乘、除操作,即实现算法来求解a+b mod n, a-b mod n, a?b mod n, a÷b mod n。 ③输入输出均在文件中。 ④分析算法的时空复杂性。 8. 敢死队问题。 有M个敢死队员要炸掉敌人的一碉堡,谁都不想去,排长决定用轮回数数的办法来决定哪个战士去执行任务。如果前一个战士没完成任务,则要再派一个战士上去。现给每个战士编一个号,大家围坐成一圈,随便从某一个战士开始计数,当数到5时,对应的战士就去执行任务,且此战士不再参加下一轮计数。如果此战士没完成任务,再从下一个战士开始数数,被数到第5时,此战士接着去执行任务。以此类推,直到任务完成为止。排长是不愿意去的,假设排长为1号,请你设计一程序,求出从第几号战士开始计数才能让排长最后一个留下来而不去执行任务。 要求:至少采用两种不同的数据结构的方法实现。 9. 简单计算器

数据结构课程设计报告

编号 课程设计 题目 1、一元稀疏多项式计算器 2、模拟浏览器操作程序 3、背包问题的求解 4、八皇后问题 二级学院计算机科学与工程学院 专业计算机科学与技术 班级 2011级 37-3班 学生姓名 XX 学号 XXXXXXXXXX 指导教师 XXXXX 评阅教师 时间 1、一元稀疏多项式计算器 【实验内容】 一元稀疏多项式计算器。

【问题描述】 设计一个一元稀疏多项式简单计算器。 【需求分析】 其基本功能包括: (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列为:n,c1,e1,c2,e2,……,cn,en,其中n 是多项式的项数,ci,ei分别是第i项的系数和指数,序列按指数降序排序;(3)多项式a和b相减,建立多项a+b; (4)多项式a和b相减,建立多项式a-b; (5)计算多项式在x处的值; (6)计算器的仿真界面(选做); 【概要设计】 -=ADT=- { void input(Jd *ha,Jd *hb); void sort(dnode *h)

dnode *operate(dnode *a,dnode *b) float qiuzhi(int x,dnode *h) f",sum); printf("\n"); } 【运行结果及分析】 (1)输入多项式:

(2)输出多项式(多项式格式为:c1x^e1+c2x^e2+…+cnx^en): (3)实现多项式a和b相加: (4)实现多项式a和b相减: (5)计算多项式在x处的值:

2、模拟浏览器操作程序 【实验内容】 模拟浏览器操作程序 【问题描述】 标准Web浏览器具有在最近访问的网页间后退和前进的功能。实现这些功能的一个方法是:使用两个栈,追踪可以后退和前进而能够到达的网页。在本题中,要求模拟实现这一功能。 【需求分析】 需要支持以下指令: BACK:将当前页推到“前进栈”的顶部。取出“后退栈”中顶端的页面,使它成为当前页。若“后退栈”是空的,忽略该命令。 FORWARD:将当前页推到“后退栈”的顶部。取出“前进栈”中顶部的页面,使它成为当前页。如果“前进栈”是空的,忽略该命令。 VISIT:将当前页推到“后退栈”的顶部。使URL特指当前页。清空“前进栈”。 QUIT:退出浏览器。 假设浏览器首先加载的网页URL是:http:

数据结构课程设计说明书讲解

安徽理工大学 数据结构 课程设计说明书题目: 一元多项式计算 院系:计算机科学与工程学院 专业班级:数字媒体13-1班 学号: 2013303102 学生姓名:钱福琛 指导教师:梁兴柱 2015年 1月 9 日

安徽理工大学课程设计(论文)任务书计算机科学与工程学院

2014年 11 月 10 日安徽理工大学课程设计(论文)成绩评定表

目录 1 问题描述 2 功能描述 2.1 课题要求........................................... 2.2 软件格式规定....................................... 3 设计 2 3.1 相关函数介绍说明................................... 3.2 主程序的流程基函数调用说明......................... 4 程序设计 4 4.1 多项式存储的实现................................... 4.2 加减乘除算法....................................... 4.2.1加法运算的实现............................... 4.2.2减法运算的实现............................... 4.2.3乘法运算的实现............................... 4.2.4除法运算的实现............................... 4.3 函数调用关系图..................................... 5 运行测试

数据结构课程设计题目表

《数据结构》课程设计课题表 课题1:设计出链表结构的相关函数库,以便在程序设计中调用。要求: (1)包括线性表的各种基本函数以及常用函数(自己确定函数、函数形式及理由)。 (2)最好能借助语言环境实现图形显示功能,以便能将抽象的数据结构以图形方式显示出来,将复杂的运行过程以动态方式显示出来。 (3)给出若干例程,演示通过调用自己的库函数来实现相关问题的求解。 课题2:设计出顺序表结构的相关函数库,以便在程序设计中调用。要求: (1)包括线性表的各种基本函数以及常用函数(自己确定函数、函数形式及理由)。 (2)最好能借助语言环境实现图形显示功能,以便能将抽象的数据结构以图形方式显示出来,将复杂的运行过程以动态方式显示出来。 (3)给出若干例程,演示通过调用自己的库函数来实现相关问题的求解。 课题3:设计程序以实现任意两个高次多项式的加法和乘法运算。 要求: (1)所设计的数据结构应尽可能节省存储空间。 (2)程序的运行时间应尽可能少。 课题4:设计一个模拟计算器的程序,要求能对包含加、减、乘、除、括号运算符及SQR和ABS函数的任意整型表达式进行求解。 要求:要检查有关运算的条件,并对错误的条件产生报警。 课题5:设计出二叉链表结构的相关函数库,以便在程序设计中调用。要求: (1)包括二叉树的各种基本函数以及常用函数(自己确定函数、函数形式及理由)。 (2)最好能借助语言环境实现图形显示功能,以便能将抽象的数据结构以图形方式显示出来,将复杂的运行过程以动态方式显示出来。 (3)给出若干例程,演示通过调用自己的库函数来实现相关问题的求解。 课题6:设计出树结构的相关函数库,以便在程序设计中调用。要求: (1)包括树结构的存储结构及各种基本函数以及常用函数(自己确定函数、函数形式及理由)。 (2)最好能借助语言环境实现图形显示功能,以便能将抽象的数据结构以图形方式显示出来,将复杂的运行过程以动态方式显示出来。 (3)给出若干例程,演示通过调用自己的库函数来实现相关问题的求解。 课题7:选择合适的存储结构表示广义表,并能实现下列运算要求: (1)用大写字母表示广义表,用小写字母表示原子,并提供设置广义表的值的功能。 (2)取广义表L的表头和表尾的函数head(L)和tail(L)。

数据结构课程设计报告

数据结构课程设计 设计说明书 TSP 问题 起止日期:2016 年 6 月27 日至2016 年7 月 1 日 学生姓名 班级 学号 成绩 指导教师( 签字) 2016 年7 月 1 日

目录 第1 章需求分析.................................................................................1... 1.1 简介 (1) 1.2 系统的开发背景 (1) 1.3 研究现状 (1) 第2 章概要设计.................................................................................2... 2.1 系统开发环境和技术介绍 (2) 2.2 系统需求分析 (2) 2.2.1 总体功能分析 (2) 2.2.2 核心功能分析 (3) 第3 章详细设计...................................................................................4... 3.1 系统开发流程 (4) 3.2 系统模块设计 (4) 3.3 系统结构 (6) 3.2 系统流程图 (6) 第4 章调试分析...................................................................................7... 4.1 程序逻辑调试 (7) 4.2 系统界面调试 (8) 第5 章测试结果...................................................................................9... 5.1 测试环境 (9) 5.2 输入输出测试项目 (9) 5.3 测试结果 (10) 结论.....................................................................................................1..1.. 参考文献................................................................................................1..1. 附录.......................................................................................................1..2..

关于数据结构课程设计心得体会范文

关于数据结构课程设计心得体会范文 心得体会是指一种读书、实践后所写的感受性文字。是指将学习的东西运用到实践中去,通过实践反思学习内容并记录下来的文字,近似于经验总结。下面是小编搜集的关于数据结构课程设计心得体会范文,希望对你有所帮助。 关于数据结构课程设计心得体会(1) 这学期开始两周时间是我们自己选题上机的时间,这学期开始两周时间是我们自己选题上机的时间,虽然上机时间只有短短两个星期但从中确实学到了不少知识。上机时间只有短短两个星期但从中确实学到了不少知识。 数据结构可以说是计算机里一门基础课程,据结构可以说是计算机里一门基础课程,但我觉得我们一低计算机里一门基础课程定要把基础学扎实,定要把基础学扎实,然而这次短短的上机帮我又重新巩固了 c 语言知识,让我的水平又一部的提高。数据结构这是一门语言知识让我的水平又一部的提高。数据结构这是一门知识,纯属于设计的科目,它需用把理论变为上机调试。 纯属于设计的科目,它需用把理论变为上机调试。它对我们来说具有一定的难度。它是其它编程语言的一门基本学科。来说具有一定的难度。它是其它编程语言的一门基本学科。我选的上机题目是交叉合并两个链表,对这个题目,我选的上机题目是交叉合并两个链表,对这个题目,我觉得很基础。刚开始调试代码的时候有时就是一个很小的错觉得很基础。 刚开始调试代码的时候有时就是一个很小的错调试代码的时候误,导致整个程序不能运行,然而开始的我还没从暑假的状导致整个程序不能运行,态转到学习上,每当程序错误时我都非常焦躁,态转到学习上,每当程序错误时我都非常焦躁,甚至想到了放弃,但我最终找到了状态,一步一步慢慢来,放弃,但我最终找到了状态,一步一步慢慢来,经过无数次的检查程序错误的原因后慢慢懂得了耐心是一个人成功的必然具备的条件! 同时,通过此次课程设计使我了解到,必然具备的条件! 同时,通过此次课程设计使我了解到,硬件语言必不可缺少,要想成为一个有能力的人,必须懂得件语言必不可缺少,要想成为一个有能力的人,硬件

数据结构课程设计(附代码)

上海应用技术学院课程设计报告 课程名称《数据结构课程设计》 设计题目猴子选大王;建立二叉树;各种排序;有序表的合并;成绩管理系统;院系计算机科学与信息工程专业计算机科学与技术班级 姓名学号指导教师日期 一.目的与要求 1. 巩固和加深对常见数据结构的理解和掌握 2. 掌握基于数据结构进行算法设计的基本方法 3. 掌握用高级语言实现算法的基本技能 4. 掌握书写程序设计说明文档的能力 5. 提高运用数据结构知识及高级语言解决非数值实际问题的能力 二.课程设计内容说明 1. 项目一 (1) 对设计任务内容的概述 学生成绩管理** 任务:要求实现对学生资料的录入、浏览、插入和删除等功能。 输入:设学生成绩以记录形式存储,每个学生记录包含的信息有:学号和各门课程的成绩,设学生成绩至少3门以上。存储结构:采用线性链式结构。 (2) 详细设计 LinkList *create():输入学生成绩记录函数; void print(LinkList *head):显示全部记录函数 LinkList *Delete(LinkList *head):删除记录函数 LinkList *Insert(LinkList *head):插入记录函数 void menu_select():菜单选择 void ScoreManage():函数界面

(3) 程序流程图 (4) 程序模块及其接口描述 该程序可以分为以下几个模块: 1、菜单选择:void menu_select(); 提供五种可以选择的操作,在main函数中通过switch语句调用菜单menu_select()函数,进入不同的功能函数中完成相关操作。

数据结构课程设计题目

数据结构课程设计 一、考核方法和容 根据课程设计过程中学生的学生态度、题目完成情况、课程设计报告书的质量和回答问题的情况等按照10%、40%、30%、20%加权综合打分。成绩评定实行优秀、良好、中等、及格和不及格五个等级。 评分标准: 优秀:答辩所有问题都能答出+报告良好 或报告良好+实现“提高部分”的功能; 良好:答辩所有问题都能答出+报告一般; 或报告一般+实现“提高部分”的功能; 中等:答辩大部分问题能答出+报告良好; 及格:答辩大部分问题能答出+报告一般; 以下四种,都不及格: 1)答辩几乎答不出问题; 2)报告几乎都是代码; 3)雷同部分达到60%; 4)课设报告与数据结构和c/c++关联不大。 课设报告的装订顺序如下: 任务书(签名,把题目要求贴在相应位置,注意下划线)-----目录(注意目录的格式,页码)-----1、设计任务(题目要求)-----2、需求分析(准备选用什么数据逻辑结构?数据元素包含哪些属性?需要哪些函数?为什么要这样设计?最后列出抽象数据类型定义)-----3、系统设计(设计实现抽象数据类型,包含选择什么物理存储方式?数据元素的结构体或类定义,以及各函数的设计思路,算法,程序流程图等)----4、编码实现(重要函数的实现代码)-----5、调试分析(选择多组测试数据、运行截图、结果分析)-----6、课设总结(心得体会)-----7、谢辞-----8、参考文献; 课设报告打印要求: B5纸打印,报告总页数控制在10—15页,报告中不能全是代码,报告中代码总量控制在3页。版式:无页眉,有页码,页码居中 字号:小四,单倍行距 字体:宋体+Times new Romar 截图:截图要配图的编号和图的题目,如:“图1 Insert函数流程图” 二、课程设计的题目 1.长整数的加法运算 2.通讯录管理系统的设计与实现——顺序表 3.广义表的应用 4.学生成绩管理系统的设计与实现 5.家谱管理系统的设计与实现

数据结构课程设计报告-学生成绩管理系统[]

武汉理工大学华夏学院课程设计报告书 课程名称:数据结构课程设计 题目:用C语言实现成绩统计程序的设计系名:信息工程系 专业班级:计算机1121 姓名:吴涛 学号:10210412104 指导教师:司晓梅 2016年3 月20日

武汉理工大学华夏学院信息工程系 课程设计任务书 课程名称:数据结构课程设计指导教师:司晓梅班级名称:计算机1121 开课系、教研室:信息系计算机 一、课程设计目的与任务 《数据结构》课程设计是为训练学生的数据组织能力和提高程序设计能力而设置的增强实践能力的课程。目的:学习数据结构课程,旨在使学生学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据的逻辑结构和存储结构以及相应操作,把现实世界中的问题转换为计算机内部的表示和处理,这就是一个良好的程序设计技能训练的过程。提高学生的程序设计能力、掌握基本知识、基本技能,提高算法设计质量与程序设计素质的培养就是本门课程的课程设计的目的。 任务:根据题目要求,完成算法设计与程序实现,并按规定写出课程设计报告。 二、课程设计的内容与基本要求 设计题目:用C语言实现成绩统计程序的设计 〔问题描述〕给出n个学生的m门课程的考试成绩信息,每条信息由姓名、课程代号与分数组成,要求设计算法: (1)输入每个人的各门课程的成绩,计算每人的平均成绩; (2)按平均成绩的高低次序,打印出个人的名次,平均成绩相同的为同一名次; (3)按名次列出每个学生的姓名和各科成绩; 〔基本要求〕学生的考试成绩必须通过键盘输入,且需对输出进行格式控制; 〔算法提示〕可以用选择排序、冒泡排序等多种排序算法求解; 具体要完成的任务是: A. 编制完成上述问题的C语言程序、进行程序调试并能得出正确的运行结果。 B. 写出规范的课程设计报告书; 三、课程设计步骤及时间进度和场地安排 时间:1周地点:现代教育中心 具体时间安排如下: 第一天:布置题目,确定任务、查找相关资料 第二天~第四天:功能分析,编写程序,调试程序、运行系统; 第五天上午:撰写设计报告; 第五天下午:程序验收、答辩。 四、课程设计考核及评分标准

相关文档
最新文档