数据结构课程设计——拓扑排序

数据结构课程设计——拓扑排序
数据结构课程设计——拓扑排序

课程设计任务书

学生姓名:专业班级:

指导教师:工作单位:计算机科学系

题目: 拓扑排序

初始条件:

(1)采用邻接表作为有向图的存储结构;

(2)给出所有可能的拓扑序列。

(3)测试用例见严蔚敏《数据结构习题集(C语言版)》p48题7.9图

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:

1. 问题描述

简述题目要解决的问题是什么。

2.设计

存储结构设计、主要算法设计(用类C/C++语言或用框图描述)、测试用例设计;

3.调试报告

调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。

4.经验和体会(包括对算法改进的设想)

5.附源程序清单和运行结果。源程序要加注释。如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出。

说明:

1.设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。

2.凡拷贝往年任务书或课程设计充数者,成绩一律无效,以0分记。

时间安排:

1.第17周完成,验收时间由指导教师指定

2.验收地点:实验中心

3.验收内容:可执行程序与源代码、课程设计报告书。

指导教师签名: 2013年6月14日

系主任(或责任教师)签名:年月日

拓扑排序

目录

1问题描述

2具体设计

2.1存储结构设计

2.2主要算法设计

2.2.1拓扑排序的算法总体设计

2.2.2将有向图表示为邻接表

2.2.3拓扑排序函数的设计

2.2.4顺序表的运算设计

2.3测试用例设计

3调试报告

3.1设计和编码的分析

3.2调试过程问题及解决

4经验与体会

5用户使用说明

6参考文献

7附录源代码与运行结果

1问题描述

题目:拓扑排序

如果用有向图表示一个工程,在这种有向图中,用顶点表示活动,用有向边表示活动vi必须先于活动vj进行,这种有向图叫做顶点表示活动的网络,记作AOV 网络。

对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得AOV网络中的所有应存在前驱和后继的关系都能得到满足,这种构造AOV网络全部顶点的拓扑有序序列的运算叫做拓扑排序。

在AOV-网中,不应该出现有向环,用拓扑排序就可以判断网中是否有环,若网中所有顶点都在它的拓扑有序序列中,则该AOV-网必定不存在环。

进行拓扑排序步骤如下:

1、输入AOV网络即有向图。令n为顶点个数。

2、从有向图上选择一个没有入度的节点并输出。

3、从网中删去该点,同时删去从该顶点发出的全部有向边。

4、重复上述2,3,直到

(1)、全部顶点均已输出,拓扑有序序列形成,拓扑排序完成。

(2)、图中还有未输出的顶点,但已跳出处理循环。这说明图中还剩下一些顶点,它们都有直接前驱,再也找不到没有前驱的顶点了,这时AOV网络中必定存在有向环。

要求:

(1)、采用邻接表作为有向图的存储结构;

(2)、给出所有可能的拓扑序列。

2具体设计

2.1存储结构设计

本问题中,我将采用三种数据结构:邻接表,顺序表和数组。

<1>邻接表:邻接表是图的链式存储结构,在邻接表的存储结构中,图中的每个顶

点对应一个单链表。从拓扑排序的步骤个方法来看,在整个排序过程中需要频繁地检查顶点的前驱以及作删除顶点和边的操作、恢复顶点和顶点前驱入度的操作。所以,

为了快速的判断顶点是否有前驱,可以在表头结点中增加一个“入度域(into)”用来指示顶点当前的入度。当into域的值为0时,表明该顶点没有前驱,可以加入到结果序列中。而删除顶点及以它为起点的边操作时,可以通过把该顶点的所有邻接点的入度域减一来完成,恢复则入度域加一。

邻接表的定义如下:

typedef struct ARCNODE{ //表结点

int adjvex; //邻接点的位置

ARCNODE *nextarc;//指向下一个结点

}ARCNODE; //邻接表中的结点类型

typedef struct VEXNODE{ //头结点

int vexdata; //顶点信息

int into; //每个顶点的入度

ARCNODE *firstarc; //指向第一个邻接结点

}VEXNODE,AdjList[MAX];//邻接表的表头结点类型

typedef struct{

AdjList vexs; //表头结点数组

int vexnum,arcnum;//顶点数、边数

}ALGraph; //邻接表类型

<2>顺序表:在整个拓扑排序的过程中,把满足条件(在此轮中未访问过visited[i]=0以及入度为0)的顶点加入到顺序表的末尾,使last加1。当一轮排序结束后,输出顺序表中的排序。接着,是恢复部分,每恢复一步,都要把visit[i]置0并且相应的入度加1,把这个顶点从顺序表中删除,重新加入到图中,进行下一轮的拓扑排序。

邻接表的顺序表定义如下:

typedef struct {

VEXNODE data[MAX];

int last;

}Sequenlist; //顺序表类型

<2>数组:产生所有的拓扑排序是一个递归(回溯)过程。其中,定义的visited[MAX]数组是一个辅助变量,数组元素的初值为0,当第i个顶点被访问后,便置visited[i]为1.记录该顶点是否被访问过。

Visited[MAX];

2.2主要算法设计

2.2.1拓扑排序的算法总体设计

因为这个课程设计题目是让AOV网络产生所有的拓扑排序,所以我想必然要用到递归或者回溯的思想。

考虑到要不断的对数据进行删除,恢复,所以考虑了顺序表,单链表,堆栈,发现用顺序表删除和插入都很简单,好实施,只要在表尾插入或是删除即可。

在整个过程中主要用到三部分:一、从图中删除,添加到顺序表中;二、递归;

三、把删除的顶点和边恢复到图中并从顺序表中删除。

首先,在整个图中搜索即没有被访问过而且入度为0 的顶点Vi,进行拓扑排序。在拓扑排序的函数里,首先将这个顶点加入到顺序表中,然后将这个顶点标志为被访问过,即Visited[i]=1。把以这个顶点为起点的邻接点的入度均减1.

然后,判断顺序表的表长是否等于图的顶点数。如果不相等的话,则继续判断图中是否还存在满足拓扑排序条件的顶点,若存在就再次调用拓扑排序函数。

接下来,就是使刚排序过的顶点Vi的标志恢复到原始状态0,每个以Vi为起点的邻接点的入度加1,恢复到原来的状态。把顶点Vi从顺序表中删除。

如果,顺序表的表长等于图的顶点数,那么就输出这一种拓扑排序序列。计数器count加1之后,就是采用递归,不断的调用拓扑排序函数,不断的恢复、删除,直到排出所有的拓扑序列。

最后,如果count大于0的话,那么就输出有count种拓扑排序。否则,输出此图不是AOV网,无拓扑排序序列产生。

2.2.2将有向图表示为邻接表

在产生拓扑排序的算法设计中,首先要将有向图用邻接表表示,主要流程如下:

2.2.3拓扑排序函数的设计

2.2.4顺序表的运算设计

2.3测试用例设计

1

图2

图3

图4

3调试报告

3.1设计和编码的分析

1、邻接表实现拓扑序列shixian()

在本函数里,首先定义一个顺序表,然后把它置空。接着,以邻接表创建一个图,并且把它赋给图G。接着,把全局变量数组visited[]初始化。对于整个图中,没被访问过的而且入度为0的顶点进行拓扑排序。如果常量count等于0的话,说明图有回路,不能拓扑排序。否则,在拓扑排序函数中会输出所有的拓扑排序序列。

void shixian()

{

Sequenlist A,*L=&A;

L=(Sequenlist *)malloc(sizeof(Sequenlist));

Setnull(L);

ALGraph G;

G=creatGraph();

for(int n=1;n<=G.vexnum;n++)

{visited[n]=0;}

int i;

cout<<"该图的所有拓扑排序为:"<

for(i=1;i<=G.vexnum;i++)

if((G.vexs[i].into==0)&&(visited[i]==0))

if(count<=0)

cout<<"您输入的图不是有向无环图,故无拓扑排序序列产生."<

else

{ cout<<"此图有"<

count=0;}

}

2、邻接表的主要算法拓扑排序topusort()

void topusort(Sequenlist *L,ALGraph G,int i)

{

int j,k;

SqLinsert(L,G.vexs[i]); //把顶点Vi加入到顺序表中

P=G.vexs[i].firstarc;

visited[i]=1; //把排序过的点标记

while(P!=NULL)

{

j=P->adjvex;

G.vexs[j].into--; //把以Vi为头的终止结点入度减1

P=P->nextarc;

}

for(k=1;k<=G.vexnum;k++)

if((visited[k]==0)&&(G.vexs[k].into==0))// 如果Vk在此轮中未被访问过且入度为0 topusort(L,G,k);

if(L->last==G.vexnum) //判断顺序表中一种拓扑排序完成

{

output(L);

cout<

count++;

}

visited[i]=0; //使Vi恢复为未访问

while(P!=NULL)

j=P->adjvex;

G.vexs[j].into++; //使Vj的入度恢复

P=P->nextarc;

}

SqLdelete(L,G.vexs[i]);

}

3、顺序表函数

在这个设计中,只有顺序表的简单应用,置空,插入,删除和输出。插入和删除都只是在表尾插入和删除。即只要把表长加1或是减1.

Sequenlist *Setnull(Sequenlist *L)//顺序表置空

{

L->last=0;

return(L);

}

void SqLinsert(Sequenlist *L,VEXNODE x)//在顺序表尾插入新接点

{

L->last=L->last+1;

L->data[L->last]=x;

}

void SqLdelete(Sequenlist *L,VEXNODE x)//删除顺序表中的最后一个节点

{

L->last=L->last-1;

}

int count=0;

void output(Sequenlist *L) //输出顺序表中的元素

{

int i;

for(i=1;i<=L->last;i++)

{

if(ilast)

else cout<<"V"<data[i].vexdata;

}

cout<

}

3.2调试过程问题及解决

在调试的过程中出现了很多语法错误,如:开始没有申明iostream头文件,导致所有的<<,>>输入输出流都是错误的,还有error C2562: 'main' : 'void' function returning a value,发现main函数被我定义为了void返回类型,可是我在函数语句里又使用了return 0;把main函数的返回值改成int即可,还有其他的语法错误都根据提示一一改进了。

接着,我发现无论如何输出的结果都是零种排序,于是找到了ALGraph creatGraph()函数的一组赋值语句,开始我是这样写的“G.vexs=al;”后来改成

for(i=0;i

{

alg.vexs[i].vexdata=al[i].vexdata;

alg.vexs[i].indegree=al[i].indegree;

alg.vexs[i].firstarc=al[i].firstarc;

}

再次运行时,输出结果还是不对。最后发现在for语句前少了alg.vexnum=n;alg.arcnum=e;赋值语句。

在topusort函数中下列语句使得运行结果一直为您输入的图不是有向无环图,故无拓扑排序序列产生.

for(k=1;k<=G.vexnum;k++)

if((visited[k]==0)&&(G.vexs[k].into==0))// 如果Vk在此轮中未被访问过且入度为0

{if(L->last==G.vexnum) //判断顺序表中一种拓扑排序完成

{

output(L);

cout<

count++;

}

topusort(L,G,k);

改成如下代码即可:

for(k=1;k<=G.vexnum;k++)

if((visited[k]==0)&&(G.vexs[k].into==0))// 如果Vk在此轮中未被访问过且入度为0

topusort(L,G,k);

if(L->last==G.vexnum) //判断顺序表中一种拓扑排序完成

{

output(L);

cout<

count++;

}

4经验与体会

此次课程设计为拓扑排序,利用c++语言实现的,此算法还有多发面可以改进,比如图的表示利用的是邻接表,还可以在代码中增加邻接矩阵的表示方法,使得对于两种形式表示的图都可以进行拓扑排序,还有在代码中并没有把邻接表很直观的输出给用户,如果可以编写代码把邻接表很直观的输出,会更有可读性。在执行的过程中发现对于大量的数据,比如边比较复杂的情况,程序执行就有可能会崩溃,说明程序的健壮性还有待提高。

通过五天的课程设计,我巩固了以前学过的知识,懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,理论知识是为将来的实践服务的,理论知识很重要,实践活动更重要。通过课程设计我看到自己实际操作能力的严重不足,知识理解不够深刻,掌握不够牢固,编程基础薄弱,没有耐心。在同学和相关资料的帮助下,最终完成了代码。通过这次设计,我看到自身学习方法存在很多错误,我决心在以后的学习过程中,要多锻炼自己处理实际问题的能力,要提高独立分析问题和解决问题的能力,多动手多上机操作。并且利用假期时间进一步巩固数据结构课程与C++语言基础,为今后的学习打下比较坚实的基础。

5用户使用说明

运行后,根据提示,“请输入结点数”,即输入图的顶点数目,“请入边总数数”,即输入图的边数;接着

例如:

请输入顶点数:4

请输入弧数:4

请输入边的信息:

请输入第一条边:1 2

请输入第二条边:1 3

请输入第三条边:2 3

请输入第四条边:3 4

6参考文献:

[1].严蔚敏,吴伟民。数据结构题集(c语言)。清华大学出版社,2011年11月。

[2].殷人昆。数据结构(用面向对象方法与C++语言描述)(第2版)。清华大学出版社,2007年6月7附录源代码与运行结果

源程序代码(c++语言)

#include

#include

#include

#include

#define NULL 0

#define maxlen 100

typedef struct ARCNODE //表结点

{

int adjvex;//接邻点的位置

}ARCNODE; //邻接表中的结点类型

typedef struct VEXNODE //头结点

{

int vexdata;//顶点的位置

int into; //顶点的入度

ARCNODE *firstarc;//指向第一个邻接结点}VEXNODE,AdjList[maxlen];//表头结点类型

typedef struct

{

AdjList vexs;//表头结点数组

int vexnum,arcnum;//顶点数、边数

}ALGraph;//邻接表类型

typedef struct

{

VEXNODE data[maxlen];

int last;

}Sequenlist; //顺序表类型

typedef struct

{

int data[maxlen];

int last;

}Seqlist; //顺序表

ALGraph creatGraph()

{

int n,e,i,j,k;

ARCNODE *p;

cout<

cout<<"------------------------拓扑排序----------------------"<

cout<<"请输入结点数: ";

cin>>n;

for(i=1;i<=n;i++) //初始化表头结点数组

{

al[i].vexdata=i;

al[i].into=0;

al[i].firstarc=NULL;

}

cout<<"请输入边总数: ";

cin>>e;

cout<<"请依次输入边的信息:"<

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

{

cout<<"请输入第"<

cin>>j>>k; //依次读入边的信息

p=(ARCNODE *)malloc(sizeof(ARCNODE));

p->adjvex=k;

al[k].into++; //把终止结点的入度加1

p->nextarc=al[j].firstarc; //用头插法把p插入到链表中

al[j].firstarc=p;

}

cout<

ALGraph alg;

alg.vexnum=n;

alg.arcnum=e;

for(i=1;i<=alg.vexnum;i++) //把头结点表头数组的值赋给邻接表表头数组{

alg.vexs[i].vexdata=al[i].vexdata;

alg.vexs[i].into=al[i].into;

}

return alg;

}

Sequenlist *Setnull(Sequenlist *L)//顺序表置空

{

L->last=0;

return(L);

}

void SqLinsert(Sequenlist *L,VEXNODE x)//在顺序表尾插入新接点

{

L->last=L->last+1;

L->data[L->last]=x;

}

void SqLdelete(Sequenlist *L,VEXNODE x)//删除顺序表中的最后一个节点{

L->last=L->last-1;

}

int count=0;

void output(Sequenlist *L) //输出顺序表中的元素

{

int i;

for(i=1;i<=L->last;i++)

{

if(ilast)

cout<<"V"<data[i].vexdata<<"----->";

else cout<<"V"<data[i].vexdata;

}

cout<

}

ARCNODE *P;

数据结构拓扑排序课程设计

课题二拓扑排序 2.1 问题的提出2.1 问题的提出 任务:编写函数实现图的拓扑排序。 程序所实现的功能:建立对应的邻接表,对该图进行拓扑排序,并显示排序 结果。 输入: 顶点数, 边数及各顶点信息(数据格式为整形) 输出: 拓扑排序结果。 2. 2 概要设计 1.拓扑排序是指由某个集合上的一个偏序得到该集合上的一个全序。更直观地讲,一个偏序是自反的、反对称的,用图表示时每个点都有环且只有单向边。拓扑排序的任务是在这个偏序上得到一个全序,即得到一个完成整个项目的各步骤的序列。 2.解决拓扑排序的方法如下: (1)在有向图中选一个没有前驱的顶点且输出之。 (2)从图中删除该顶点和所有以它为尾的弧。 重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。后一种情况则说明有向图中存在环。具体的算法实现参照源程序。 3.构造邻接表图:typedef struct{ AdjList vertices; int vexnum,arcnum; }Graph;//邻接表图 4.为了避免重复检测入度为零的顶点,源程序中设了一个栈,暂存所有入度为零的顶点:typedef struct stack{ int *base; int *top; int stacksize;

}sqstack;//栈的结构,存储图的顶点序号 2.3 流程图2.根据算法思想,画流程图如下:

2.4 源代码 //采用尾插法创的邻接图 #include using namespace std; const int MAX=20; const int STACK_INIT_SIZE=100; const int ERROR=0; typedef struct stack{ int *base; int *top; int stacksize; }sqstack;//栈的结构,存储图的顶点序号 typedef struct lnode { int adjvex; struct lnode *next; }ArcNode;//弧结点 typedef struct node2 { char data; ArcNode *fristarc; }VNode,AdjList[MAX];//顶点数组,fristarc指向与顶点邻接的第一条弧 typedef struct{ AdjList vertices; int vexnum,arcnum; }Graph;//邻接表图 void Initstack(sqstack &s) { s.base=new int;

数据结构课程设计

1.一元稀疏多项式计算器 [问题描述] 设计一个一元稀疏多项式简单计算器。 [基本要求] 输入并建立多项式; 输出多项式,输出形式为整数序列:n, c1, e1, c2, e2,……, cn, en ,其中n是多项式的项数,ci, ei分别是第i项的系数和指数,序列按指数降序排序; 多项式a和b相加,建立多项式a+b; 多项式a和b相减,建立多项式a-b; [测试数据] (2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2-x2+7.8x15)=(-7.8x15-1.2x9-x+12x-3) (1+x+x2+x3+x4+x5)+(-x3-x4)=(x5+x2+x+1) (x+x3)+(-x-x3)=0 (x+x2+x3)+0=(x3+x2+x) [实现提示] 用带头结点的单链表存储多项式,多项式的项数存放在头结点中。 2.背包问题的求解 [问题描述] 假设有一个能装入总体积为T的背包和n件体积分别为w1, w2, …,wn的物品,能否从n件物品中挑选若干件恰好装满背包,即使w1+w2+…+wn=T,要求找出所有满足上述条件的解。例如:当T=10,各件物品的体积为{1,8,4,3,5,2}时,可找到下列4组解:(1,4,3,2)、(1,4,5)、(8,2)、(3,5,2) [实现提示] 可利用回溯法的设计思想来解决背包问题。首先,将物品排成一列,然后顺序选取物品转入背包,假设已选取了前i件物品之后背包还没有装满,则继续选取第i+1件物品,若该件物品“太大”不能装入,则弃之而继续选取下一件,直至背包装满为止。但如果在剩余的物品中找不到合适的物品以填满背包,则说明“刚刚”装入背包的那件物品“不合适”,应将它取出“弃之一边”,继续再从“它之后”的物品中选取,如此重复,直至求得满足条件的解,或者无解。 由于回溯求解的规则是“后进先出”因此自然要用到栈。 3.完全二叉树判断 用一个二叉链表存储的二叉树,判断其是否是完全二叉树。 4.最小生成树求解(1人) 任意创建一个图,利用克鲁斯卡尔算法,求出该图的最小生成树。 5.最小生成树求解(1人) 任意创建一个图,利用普里姆算法,求出该图的最小生成树。 6.树状显示二叉树 编写函数displaytree(二叉树的根指针,数据值宽度,屏幕的宽度)输出树的直观示意图。输出的二叉树是垂直打印的,同层的节点在同一行上。 [问题描述] 假设数据宽度datawidth=2,而屏幕宽度screenwidth为64=26,假设节点的输出位置用 (层号,须打印的空格数)来界定。 第0层:根在(0,32)处输出;

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

《数据结构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

数据结构课程设计

题目: 学院: 专业班级: 学生姓名: 指导教师: 2016 年06 月2 9日

目录 一、课程设计目的 (3) 二、课程设计步骤 (3) 三、课程设计内容 (4) 四、课程设计报告 (6) 五、提交材料 (6) 六、考核方式与评分标准 (7) 七、参考文献 (8) 附录1 齐齐哈尔大学软件工程系课程设计说明书(报告)撰写规范 (9)

一、课程设计目的及要求 《数据结构与算法分析》课程设计培养计算机专业的学生的算法程序设计能力。通过上机实验,可以培养学生程序设计的方法和技巧,提高学生编制清晰、合理、可读性好的系统程序的能力,加深对数据结构课程和算法的理解。使学生更好地掌握数据结构的基本概念、基本原理、及基本算法,具有分析算法、设计算法、构造和开发较复杂算法的基本能力。 要求学生能综合运用《数据结构与算法分析》的相关知识,培养学生上机解决一些与实际应用结合紧密的、规模较大的问题的能力,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析实际问题的能力并提高C语言编程技巧,培养良好的编程风格。 课程设计要求独立完成,题目自选(参考题目见三,也可自拟),但需要老师确认(6月16日前定题),一人一题,要求程序有能采用交互式工作方式的界面进行功能的选择,只能用文件存储数据和处理数据不能使用数据库。要求在教学周的第18周前完成。 二、课程设计步骤 随着计算机性能的提高,它所面临的软件开发的复杂度也日趋增加。然而,编制一个10000行的程序的难度绝不仅仅是一个5000行的程序的两倍,因此软件开发需要系统的方法。一种常用的软件开发方法,是将软件开发过程分为分析、设计、实现和维护四个阶段。虽然数据结构课程中的课程设计的复杂度远不如(从实际问题中提出来的)一个“真正的”软件,但为了培养一个软件工作者所应具备的科学工作的方法和作风,完成课程设计的应有如下的5个步骤: 1.问题分析和任务定义 通常,课程设计题目的陈述比较简洁,或者说是有模棱两可的含义。因此,在进行设计之前,首先应该充分地分析和理解问题,明确问题要求做什么,限制条件是什么。注意:本步骤强调的是做什么,而不是怎么做。对问题的描述应避开算法和所涉及的数据类型,而是对所需完成的任务作出明确的回答。例如:输入数据的类型、值的范围以及输入的形式;输出数据的类型、值的范围及输出的形式;若是会话式的输入,则结束标志是什么,是否接受非法的输入,对非法输入的回答方式是什么等等。这一步还应该为调试程序准备好测试数据,包括合法的输入数据和非法形式输入的数据。 2.数据类型和系统设计 在设计这一步骤中需分逻辑设计和详细设计两步实现。逻辑设计指的是,对问题描述中涉及的操作对象定义相应的数据类型,并按照以数据结构为中心的原则划分模块,定义主程序模块和各抽象数据类型;详细设计则为定义相应的存储结构并写出各过程和函数的伪码算法。在这个过程中,要综合考虑系统功能,使得系统结构清晰、合理、简单和易于调试,抽象数据类型的实现尽可能做到数据封装,基本操作的规格说明尽可能明确具体。作为逻辑设计的结果,应写出每个

拓扑排序课程设计报告

数据结构课程设计 设计题目:有向图拓扑排序 专业:信息与计算科学 学号:021240616 姓名:黄秋实 指导教师:文军 2013年11月28日

数据结构课程设计 ----拓扑排序 一需求分析 1.问题描述 本次课程设计题目是:用邻接表构造图然后进行拓扑排序,输出拓扑排序序列 拓扑排序的基本思想为: 1).从有向图中选一个无前驱的顶点输出;2).将此顶点和以它为起点的弧删除;3). 重复1),2)直到不存在无前驱的顶点;4). 若此时输出的顶点数小于有向图中的顶点数,则说明有向图中存在回路,否则输出的顶点的顺序即为一个拓扑序列。 2.拓扑排序有向图拓朴排序算法的基本步骤如下:①从图中选择一个入度为0的顶点,输出该顶点;②从图中删除该顶点及其相关联的弧,调整被删弧的弧头结点的入度(入度-1);③重复执行①、②直到所有顶点均被输出,拓朴排序完成或者图中再也没有入度为0的顶点(此种情况说明原有向图含有环)。 3基本要求 (1) 输入的形式和输入值的范围; 首先是输入要排序的顶点数和弧数,都为整型,中间用分隔符隔开;再输入各顶点的值,为正型,中间用分隔符隔开;然后输入各条弧的两个顶点值,先输入弧头,再输入弧尾,中间用分隔符隔开,输入的值只能是开始输入的顶点值否则系统会提示输入的值的顶点值不正确,请重新输入,只要继续输入正确的值就行。 (2) 输出的形式; 首先输出建立的邻接表,然后是最终各顶点的出度数,再是拓扑排序的序列,并且每输出一个顶点,就会输出一次各顶点的入度数。 (3) 程序所能达到的功能; 因为该程序是求拓扑排序,所以算法的功能就是要输出拓扑排序的序列,在一个有向图中,若用顶点表示活动,有向边就表示活动间先后顺序,那么输出的拓扑序列就表示各顶点间的关系为反映出各点的存储结构,以邻接表存储并输出各顶点的入度。 二概要设计 1. 算法中用到的所有各种数据类型的定义 在该程序中用邻接表作为图的存储结构。首先,定义表结点和头结点的结构类型,然后定义图的结构类型。创建图用邻接表存储的函数,其中根据要求输入图的顶点和边数,并根据要求设定每条边的起始位置,构建邻接表依次将顶点插入到邻接表中。 拓扑排序的函数在该函数中首先要对各顶点求入度,其中要用到求入度的函数,为了避免重复检测入度为零的顶点,设置一个辅助栈,因此要定义顺序栈类型,以及栈的函数:入栈,出栈,判断栈是否为空。 2.各程序模块之间的层次调用关系 第一部分,void ALGraph *G函数构建图,用邻接表存储。这个函数没有调

数据结构课程设计(内部排序算法比较_C语言)

数据结构课程设计 课程名称:内部排序算法比较 年级/院系:11级计算机科学与技术学院 姓名/学号: 指导老师: 第一章问题描述 排序是数据结构中重要的一个部分,也是在实际开发中易遇到的问题,所以研究各种排算法的时间消耗对于在实际应用当中很有必要通过分析实际结合算法的特性进行选择和使用哪种算法可以使实际问题得到更好更充分的解决!该系统通过对各种内部排序算法如直接插入排序,冒泡排序,简单选择排序,快速排序,希尔排序,堆排序、二路归并排序等,以关键码的比较次数和移动次数分析其特点,并进行比较,估算每种算法的时间消耗,从而比较各种算法的优劣和使用情况!排序表的数据是多种不同的情况,如随机产生数据、极端的数据如已是正序或逆序数据。比较的结果用一个直方图表示。

第二章系统分析 界面的设计如图所示: |******************************| |-------欢迎使用---------| |-----(1)随机取数-------| |-----(2)自行输入-------| |-----(0)退出使用-------| |******************************| 请选择操作方式: 如上图所示该系统的功能有: (1):选择1 时系统由客户输入要进行测试的元素个数由电脑随机选取数字进行各种排序结果得到准确的比较和移动次数并 打印出结果。 (2)选择2 时系统由客户自己输入要进行测试的元素进行各种排序结果得到准确的比较和移动次数并打印出结果。 (3)选择0 打印“谢谢使用!!”退出系统的使用!! 第三章系统设计 (I)友好的人机界面设计:(如图3.1所示) |******************************| |-------欢迎使用---------| |-----(1)随机取数-------| |-----(2)自行输入-------| |-----(0)退出使用-------|

数据结构课程设计报告

《数据结构与算法》课程设计报告 学号: 班级序号: 姓名: 指导教师: 成绩: 中国地质大学信息工程学院地理信息系统系 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. 学生必须仔细阅读《数据结构》课程设计方案,认真主动完成课设的要求。有问题及时主动通过各种方式与教师联系沟通。 2. 学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况, 二、数据结构课程设计题目 1. 运动会分数统计(限 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)能统计各学校总分, 3)可以按学校编号或名称、学校总分、男女团体总分排序输出; 4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。 5)数据存入文件并能随时查询 6)规定:输入数据形式和范围:可以输入学校的名称,运动项目的名称输出形式:有中文提示,各学校分数为整形 界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。 存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在 c 语言程序设计的书上,请自学解决) 请在最后的上交资料中指明你用到的存储结构; 测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明; 2. 飞机订票系统(限1 人完成)任务:通过此系统可以实现如下功能:录入:可以录入航 班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)查询: 可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓); 可以输入起飞抵达城市,查询飞机航班情况;订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;退票:可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。修改航班信息: 当航班信息改变可以修改航班数据文件要求: 根据以上功能说明,设计航班信息,订票信息的存储结构,设计程序完成功能; 3. 文章编辑(限 1 人完成)功能:输入一页文字,程序可以统计出文字、数字、空格的个数。静态存储一页文章,每行最多不超过80 个字符,共N 行;要求(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。 存储结构使用线性表,分别用几个子函数实现相应的功能;输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。输出形式:(1)分行输出用户输入的各行字符;(2)分 4 行输出"全部字母数"、"数字个数" 、"空格个数"、"文章总字数" (3)输出删除某一字符串后的文章;

数据结构课程设计:拓扑排序和关键路径复习进程

数据结构课程设计:拓扑排序和关键路径

1 ABSTRACT 1.1图和栈的结构定义 struct SqStack////栈部分 { SElemType *base;//栈底指针 SElemType *top;//栈顶指针 int stacksize;//栈的大小 int element_count;//栈中元素个素 }; /////////AOE网的存储结构 struct ArcNode //表结点 { int lastcompletetime;//活动最晚开始时间 int adjvex; //点结点位置 int info; //所对应的弧的权值 struct ArcNode *next;//指向下一个表结点指针 }; struct VNode //点结点 { VertexType data; //结点标志 int indegree; //该结点入度数 int ve; //记录结点的最早开始时间 int vl; //记录结点的最晚开始时间 struct ArcNode *first_out_arc; //存储下一个出度的表结点struct ArcNode *first_in_arc;//存储下一个入度的表结点 }; struct ALGraph

{ VNode *vertices; //结点数组 int vexnum; //结点数 int arcnum; //弧数 int kind; //该图的类型 }; 2系统总分析 2.1关键路径概念分析 2.1.1什么是关键路径 关键路径法(Critical Path Method, CPM)最早出现于20世纪50年代,它是通过分析项目过程中哪个活动序列进度安排的总时差最少来预测项目工期的网络分析。这种方法产生的背景是,在当时出现了许多庞大而复杂的科研和工程项目,这些项目常常需要运用大量的人力、物力和财力,因此如何合理而有效地对这些项目进行组织,在有限资源下以最短的时间和最低的成本费用下完成整个项目就成为一个突出的问题,这样CPM就应运而生了。对于一个项目而言,只有项目网络中最长的或耗时最多的活动完成之后,项目才能结束,这条最长的活动路线就叫关键路径(Critical Path),组成关键路径的活动称为关键活动。 2.1.2关键路径特点 关键路径上的活动持续时间决定了项目的工期,关键路径上所有活动的持续时间总和就是项目的工期。 关键路径上的任何一个活动都是关键活动,其中任何一个活动的延迟都会导致整个项目完工时间的延迟。

数据结构课程设计-排序

一、问题描述 1、排序问题描述 排序是计算机程序设计的一种重要操作,他的功能是将一组任意顺序数据元素(记录),根据某一个(或几个)关键字按一定的顺序重新排列成为有序的序列。简单地说,就是将一组“无序”的记录序列调整为“有序”的记录序列的一种操作。 本次课程设计主要涉及几种常用的排序方法,分析了排序的实质,排序的应用,排序的分类,同时进行各排序方法的效率比较,包括比较次数和交换次数。我们利用java语言来实现本排序综合系统,该系统包含了:插入排序、交换排序、选择排序、归并排序。其中包括: (1)插入排序的有关算法:不带监视哨的直接插入排序的实现; (2)交换排序有关算法:冒泡排序、快速排序的实现; (3)选择排序的有关算法:直接选择排序、堆排序的实现; (4)归并排序的有关算法:2-路归并排序的实现。 2、界面设计模块问题描述 设计一个菜单式界面,让用户可以选择要解决的问题,同时可以退出程序。界面要求简洁明了,大方得体,便于用户的使用,同时,对于用户的错误选择可以进行有效的处理。 二、问题分析 本人设计的是交换排序,它的基本思想是两两比较带排序记录的关键字,若两个记录的次序相反则交换这两个记录,直到没有反序的记录为止。应用交换排序基本思想的主要排序方法有冒泡排序和快速排序。 冒泡排序的基本思想是:将待排序的数组看作从上到下排列,把关键字值较小的记录看作“较轻的”,关键字值较大的纪录看作“较重的”,较小关键字值的记录好像水中的气泡一样,向上浮;较大关键字值的纪录如水中的石块向下沉,当所有的气泡都浮到了相应的位置,并且所有的石块都沉到了水中,排序就结束了。 冒泡排序的步骤: 1)置初值i=1; 2)在无序序列{r[0],r[1],…,r[n-i]}中,从头至尾依次比较相邻的两个记录r[j] 与r[j+1](0<=j<=n-i-1),若r[j].key>r[j+1].key,则交换位置; 3)i=i+1; 4)重复步骤2)和3),直到步骤2)中未发生记录交换或i=n-1为止; 要实现上述步骤,需要引入一个布尔变量flag,用来标记相邻记录是否发生交换。 快速排序的基本思想是:通过一趟排序将要排序的记录分割成独立的两个部分,其中一部分的所有记录的关键字值都比另外一部分的所有记录关键字值小,然后再按此方法对这两部分记录分别进行快速排序,整个排序过程可以递归进行,以此达到整个记录序列变成有序。 快速排序步骤: 1)设置两个变量i、j,初值分别为low和high,分别表示待排序序列的起始下

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

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

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

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

数据结构课程设计内容

(一)课程设计要求 1.分组要求 每个人一个小组进行分组。 2.实训目的 (1)熟悉课程所学的内容,包括线性表、链表、串,栈,队列,树,图,查找和排序; (2)学生能够按照软件工程的规范要求,能够运用软件工程的基本概念、方法与过程来进行软件的设计与开发。 3.课程设计要求 (1)每组学生在以下项目中选择一项完成即可; (2)编写程序要严格按照程序编程规范进行代码编写; (2)必须按照个体软件的过程,真实地采集数据、填写相关的表格、编写有关的文档; (3)按照老师的要求,每个人必须独立完成; (4)按照实训的时间安排进行实训,实训结束后提交有关的表格与文档。(二)课程设计题目 1.线性表 (1)实验目的:利用顺序结构和链式结构实现线性表的基本运算。 (2)实验要求:对于顺序存储结构的线性表,验证其插入、删除操作;对以链式存储结构存储的线性表,验证其插入、删除、查找操作。 2.火车列车调度问题 (1)实验目的:利用顺序结构和链式结构实现栈和队列的基本运算 (2)实验要求:栈操作的验证火车调度;对于顺序队列、链队列的基本操作进行验证; 3.稀疏矩阵 (1)实验目的:利用三元组和十字链表实现稀疏矩阵的有关算法 (2)实验要求:以三元组作为存储结构实现稀疏矩阵的转置

4.二叉树 (1)实验目的:利用二叉链表实现二叉树的建立和遍历 (2)实验要求:以二叉链表作为存储结构建立二叉树;以二叉链表作为存储结构实现先序、中序和后序遍历二叉树 5.图的遍历和最短路径问题 (1)实验目的:在图的两种存储结构基础上实现图的遍历 (2)实验要求:采用连通无向图作为遍历对象对以邻接矩阵为存储结构的图实现深度优先搜索和广度搜索遍历;采用连通无向图作为遍历对象,建立邻接表时顶点对序号从大到小输入,对以邻接表为存储结构的图实现深度优先搜索和广度优先搜索遍历; 6.排序与查找 (1)实验目的:验证各排序与查找算法 (2)实验要求:编程实现排序与查找算法,包括直接插入排序、选择和起泡排序、折半查找 7.综合课程设计1 (1)实验目的:综合应用所学知识;培养系统设计的整体思想;提高编写程序、调试程序的能力;学习系统测试的方法;学习编写技术文档; (2)实验要求:约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m是停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数。如此下去,直到所有人全部出列为止。令n最大值取30。要求设计一个程序模拟此过程,求出出列编号序列; 8.综合课程设计2 (1)实验目的:综合应用所学知识;培养系统设计的整体思想;提高编写程序、调试程序的能力;学习系统测试的方法;学习编写技术文档; (2)实验要求:设计一个校园导游程序,为来访的客人提供各种信息查询

教学计划安排检验程序(拓扑排序)报告书

设计题目: 示例数据:输入:学期数:5,课程数:12,课程间的先后关系数:16,课程的代表值:v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12。课程间两两间的先后关系:v1 v2,v1 v3, v1 v4,v1 v12,v2 v3,v3 v5,v3 v7,v3 v8,v4 v5, v5 v7,v6 v8,v9 v10, v9 v11 , v9 v12,v10 v12,v11 v6 输出:第1学期应学的课程:v1 v9 第2学期应学的课程:v2 v4 v10 v11 第3学期应学的课程:v3 v6 v12 第4学期应学的课程:v5 v8 第5学期应学的课程:v7

一需求分析 1.1 引言 通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。离散数学中关于偏序和全序的定义: 若集合X上的关系是R,且R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。 设R是集合X上的偏序(Partial Order),如果对每个x,y属于X必有xRy 或 yRx,则称R是集合X上的全序关系。 比较简单的理解:偏序是指集合中只有部分成员可以比较,全序是指集合中所有的成员之间均可以比较。 一般应用:拓扑排序常用来确定一个依赖关系集中,事物发生的顺序。例如,在日常工作中,可能会将项目拆分成A、B、C、D四个子部分来完成,但A依赖于B和D,C依赖于D。为了计算这个项目进行的顺序,可对这个关系集进行拓扑排序,得出一个线性的序列,则排在前面的任务就是需要先完成的任务。 1.2 拓扑排序的了解 ①.问题的描述 在AOV网中为了更好地完成工程,必须满足活动之间先后关系,需要将各活动排一个先后次序即为拓扑排序。拓扑排序可以应用于教学计划的安排,根据课程之

数据结构课程设计排序实验报告

《数据结构》课程设计报告 专业 班级 姓名 学号 指导教师 起止时间

课程设计:排序综合 一、任务描述 利用随机函数产生n个随机整数(20000以上),对这些数进行多种方法进行排序。(1)至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序)。并把排序后的结果保存在不同的文件中。 (2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。 要求:根据以上任务说明,设计程序完成功能。 二、问题分析 1、功能分析 分析设计课题的要求,要求编程实现以下功能: (1)随机生成N个整数,存放到线性表中; (2)起泡排序并计算所需时间; (3)简单选择排序并计算时间; (4)希尔排序并计算时间; (5)直接插入排序并计算所需时间; (6)时间效率比较。 2、数据对象分析 存储数据的线性表应为顺序存储。 三、数据结构设计 使用顺序表实现,有关定义如下: typedef int Status; typedef int KeyType ; //设排序码为整型量 typedef int InfoType; typedef struct { //定义被排序记录结构类型 KeyType key ; //排序码 I nfoType otherinfo; //其它数据项 } RedType ; typedef struct { RedType * r; //存储带排序记录的顺序表 //r[0]作哨兵或缓冲区 int length ; //顺序表的长度 } SqList ; //定义顺序表类型 四、功能设计 (一)主控菜单设计

数据结构课程设计报告

编号 课程设计 题目 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:

数据结构课程设计报告撰写要求

数据结构课程设计报告撰写要求 (一)纸张与页面设置 1.采用国际标准A4型打印纸或复印纸,纵向打印。 2.页边距:上3.5cm、下2.5cm、左边距3.0cm,右边距2.5cm。 3.页眉2.5cm、页脚1.8cm、对称页边距。 (二)页眉 “沈阳航空工业学院课程设计报告”,五号楷体,居中。 (三)页脚 标页码,五号宋体,居中。 (四)题目、摘要、关键词 题目:小二号黑体,居中。 (五)标题 一级标题,三号粗宋体,居中,用“1 ”、“2 ”、“3 ”…等表示序号。 二级标题,小三号粗宋体,左对齐,用“1.1”、“1.2”、“1.3”…等表示序号。 三级标题,四号粗宋体,左对齐,用“1.1.1”、“1.1.2”、“1.1.3”…等表示序号。(六)正文 小四号宋体,两端对齐,1.5倍行距。 (七)图、表 1.表头包括:表标识及表名两部分,表头在表上,居中,用五号宋体字。 2.图头包括:图标识及图名两部分,图头在图下,居中,用五号宋体字。 (八)参考文献 格式:[序号]作者.译者.书名.版本.出版社,出版时间 (九)报告封页及模版见下页

沈阳航空工业学院 课程设计报告 课程设计名称:数据结构课程设计 课程设计题目:PRIM算法求最小生成树 院(系):计算机学院 专业:计算机科学与技术 班级:7401102班 学号:200704011030 姓名: 指导教师:郑志勇

目录 沈阳航空工业学院 ...................................................................................................... - 2 - 1 需求分析 (1) 1.1题目内容及要求 (1) 1.2题目分析 (1) 2 系统设计 (3) 2.1数据结构设计 (3) 2.2函数设计 (4) 2.2.1系统流程 (5) 图2.2.1 系统流程 (5) 2.2.2 PRIM 函数流程 (5) 2.2.3 Huitu函数流程 (6) 2.2.4 GraphicVer函数输出邻接矩阵 (6) 3 调试分析 (7) 3.1调试初期 (7) 3.2调试中期 (7) 3.3调试后期 (9) 4 测试及运行结果 (10) 4.1欢迎界面 (10) 4.2获取输入,绘制无向图 (10) 4.3输出邻接矩阵 (13) 4..4.演示PRIM算法生成最小生成树 (13) 4.5用户退出 (14) 参考文献 (15) 附录(关键部分程序清单) (16)

拓扑排序课程设计报告

沈阳航空航天大学 课程设计报告 课程设计名称:数据结构课程设计 课程设计题目:拓扑排序算法 院(系):计算机学院 专业:计算机科学与技术(嵌入式系统方向) 班级:14010105班 学号:2011040101221 姓名:王芃然 指导教师:丁一军

目录 沈阳航空航天大学.................................................... I 1 课程设计介绍.. (1) 1.1课程设计内容 (1) 1.2课程设计要求 (1) 2 课程设计原理 (2) 2.1课设题目粗略分析 (2) 2.2原理图介绍 (2) 2.2.1 功能模块图 (2) 2.2.2 流程图分析 (3) 3 数据结构分析 (7) 3.1存储结构 (7) 3.2算法描述 (7) 4 调试与分析 (12) 4.1调试过程 (12) 4.2程序执行过程 (12) 参考文献 (15) 附录(关键部分程序清单) (16)

1 课程设计介绍 1.1 课程设计内容 由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。若在图一的有向图上人为的加一个表示V2<=V3的弧(“<=”表示V2领先于V3)则图一表示的亦为全序且这个全序称为拓扑有序,而由偏序定义得到拓扑有序的操作便是拓扑排序。在AOV网中为了更好地完成工程,必须满足活动之间先后关系,需要将各活动排一个先后次序即为拓扑排序。编写算法建立有向无环图,主要功能如下: 1.能够求解该有向无环图的拓扑排序并输出出来; 2.拓扑排序应该能处理出现环的情况; 3.顶点信息要有几种情况可以选择。 1.2 课程设计要求 1.输出拓扑排序数据外,还要输出邻接表数据; 2.参考相应的资料,独立完成课程设计任务; 3.交规范课程设计报告和软件代码。

数据结构课程设计排序算法总结

排序算法: (1) 直接插入排序 (2) 折半插入排序(3) 冒泡排序 (4) 简单选择排序 (5) 快速排序(6) 堆排序 (7) 归并排序 【算法分析】 (1)直接插入排序;它是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好的序的有序表中,从而得到一个新的、记录数增加1的有序表。 (2)折半插入排序:插入排序的基本操作是在一个有序表中进行查找和插入,我们知道这个查找操作可以利用折半查找来实现,由此进行的插入排序称之为折半插入排序。折半插入排序所需附加存储空间和直接插入相同,从时间上比较,折半插入排序仅减少了关键字间的比较次数,而记录的移动次数不变。 (3)冒泡排序:比较相邻关键字,若为逆序(非递增),则交换,最终将最大的记录放到最后一个记录的位置上,此为第一趟冒泡排序;对前n-1记录重复上操作,确定倒数第二个位置记录;……以此类推,直至的到一个递增的表。 (4)简单选择排序:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之。 (5)快速排序:它是对冒泡排序的一种改进,基本思想是,通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 (6)堆排序: 使记录序列按关键字非递减有序排列,在堆排序的算法中先建一个“大顶堆”,即先选得一个关键字为最大的记录并与序列中最后一个记录交换,然后对序列中前n-1记录进行筛选,重新将它调整为一个“大顶堆”,如此反复直至排序结束。 (7)归并排序:归并的含义是将两个或两个以上的有序表组合成一个新的有序表。假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序称为2-路归并排序。 【算法实现】 (1)直接插入排序: void InsertSort(SqList &L){ for(i=2;i<=L.length ;i++) if(L.elem[i]L.elem[0];j--) L.elem [j+1]=L.elem [j]; L.elem [j+1]=L.elem[0]; } } (2)折半插入排序:

数据结构课程设计报告

数据结构课程设计 设计说明书 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..

相关文档
最新文档