数据结构课程设计报告 Kruskal马踏棋盘joseph环.docx

上传人:b****5 文档编号:6012572 上传时间:2023-01-03 格式:DOCX 页数:25 大小:213.28KB
下载 相关 举报
数据结构课程设计报告 Kruskal马踏棋盘joseph环.docx_第1页
第1页 / 共25页
数据结构课程设计报告 Kruskal马踏棋盘joseph环.docx_第2页
第2页 / 共25页
数据结构课程设计报告 Kruskal马踏棋盘joseph环.docx_第3页
第3页 / 共25页
数据结构课程设计报告 Kruskal马踏棋盘joseph环.docx_第4页
第4页 / 共25页
数据结构课程设计报告 Kruskal马踏棋盘joseph环.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

数据结构课程设计报告 Kruskal马踏棋盘joseph环.docx

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

数据结构课程设计报告 Kruskal马踏棋盘joseph环.docx

数据结构课程设计报告Kruskal马踏棋盘joseph环

 

《数据结构》

课程设计报告

课程名称:

《数据结构》课程设计

课程设计题目:

姓名:

院系:

专业:

年级:

学号:

指导教师:

目录

实验一joseph环

1课程设计的目的………………………………………………………………1

2需求分析………………………………………………………………………1

3课程设计报告内容……………………………………………………………2

1、概要设计……………………………………………………………………2

2、详细设计……………………………………………………………………2

3、调试分析……………………………………………………………………2

4、测试结果……………………………………………………………………3

5、程序清单……………………………………………………………………3

4小结…………………………………………………………………………6

实验二迷宫问题

1课程设计的目的………………………………………………………………2

2需求分析………………………………………………………………………1

3课程设计报告内容……………………………………………………………x

1、概要设计……………………………………………………………………x

2、详细设计……………………………………………………………………x

3、调试分析……………………………………………………………………x

4、测试结果……………………………………………………………………x

5、程序清单……………………………………………………………………x

4小结…………………………………………………………………………x

实验三Kruskal算法生成最小生成树

1课程设计的目的………………………………………………………………2

2需求分析………………………………………………………………………1

3课程设计报告内容……………………………………………………………x

1、概要设计……………………………………………………………………x

2、详细设计……………………………………………………………………x

3、调试分析……………………………………………………………………x

4、测试结果……………………………………………………………………x

6、程序清单……………………………………………………………………x

4小结…………………………………………………………………………x

实验一joseph环

1、课程设计的目的

(1)熟练使用C语言编写程序,解决实际问题;

(2)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;

(3)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;

(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

2、需求分析

1、问题的提出

编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。

一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。

报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。

1、任务:

通过此系统可以实现如下功能:

(1)、输入数据:

建立输入处理输入数据,输入m的初值,n,输入每个人的密码,建立单循环链表。

(2)、输出形式:

建立一个输出函数,将正确的输出序列

2、测试数据

m的初值为20,n=7,7个人的密码依次为3,1,7,2,4,7,4,首先m=6,则正确的输出是什么?

3、课程设计报告内容

1.设计概要

利用单向循环链表存储结构模拟此过程,因为循环链表最后一个结点的指针域指向头结点,整个链表形成一人环,刚好和题中的“n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)”内容要求一致,而且,循环链表中任一结点出发均可找到表中其他结点,利用这一优点可较容易地找出报数的人及下一个报数的人,最后按照出列的顺序用一个for语句实现。

joseph环的组成成员由密码(password)和序号(No)组成,循环链表的存储结构如下:

typedefstructLNode

{

intpassword;//密码

intNo;//序号

structLNode*next;//下一成员指针

}member;//组成成员结构体

 

2.详细设计

根据算法思想,画程序流程图如下:

3、调试分析

4、用户手册

5、测试结果

6、程序清单1.3.详细设计

typedefstructLNode

{

intpassword;//密码

intNo;//序号

structLNode*next;//下一成员指针

}member;//组成成员结构体

typedefintstatus;

#defineOVERFLOW-2

#defineOK1

#defineERROR0

#include

#include

statusCreateList_Circle(member**,int);

statusDeleteNode(member**);

statusmain()

{

intn,m;

member*head=NULL,*p=NULL;//头指针即首成员地址,遍历指针p

printf("Pleaseenternumberofpeople:

\n");

scanf("%d",&n);//总成员数

while(n<=0)

{

printf("nmustbepositive,pleaseenteragain:

\n");

scanf("%d",&n);

}

if(!

CreateList_Circle(&head,n))//创建循环链表,返回头指针head

returnOVERFLOW;

printf("Pleaseenterinitialm:

\n");

scanf("%d",&m);//初始值m

while(m<=0)

{

printf("mmustbepositive,pleaseenteragain:

\n");

scanf("%d",&m);

}

printf("\nTheorderis:

\n");

p=head;

while(n>=2)//寻找出列成员

{

inti;

m=(m%n==0)?

n:

m%n;//化简m值

for(i=1;i

p=p->next;//p指向出列成员

printf("%d\n",p->No);//输出出列成员序号

m=p->password;//修改m

DeleteNode(&p);//删除链表中的出列成员

n--;//成员数自减

}

printf("%d\n",p->No);//输出最后一个成员序号

returnOK;

}

statusCreateList_Circle(member**p_head,intn)

{

//此算法创建一个无头结点的循环链表,结点数n,*p_head返回链表头指针即首结点地址

inti;

member*tail,*p;

*p_head=(member*)malloc(sizeof(member));

if(!

(*p_head))returnOVERFLOW;

(*p_head)->No=1;//储存成员一序号

printf("PleaseenterpasswordofNo.1:

\n");

scanf("%d",&(*p_head)->password);//储存成员一密码

tail=*p_head;

tail->next=NULL;

for(i=2;i

{

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

if(!

p)returnOVERFLOW;

p->No=i;//储存成员序号

printf("PleaseenterpasswordofNo.%d:

\n",i);

scanf("%d",&(p->password));//储存成员密码

tail->next=p;

tail=p;

}

tail->next=*p_head;

returnOK;

}

statusDeleteNode(member**pp)

{

//此算法删除链表中的结点*pp,操作实质是将*pp下一结点复制到*pp后将其free

member*temp;

(*pp)->password=((*pp)->next)->password;

(*pp)->No=((*pp)->next)->No;

temp=(*pp)->next;

(*pp)->next=(*pp)->next->next;

free(temp);

returnOK;

}

4、小结

一、这次课程设计的心得体会通过实践我的收获如下:

1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。

2、培养了我选用参考书,查阅手册及文献资料的能力。

培养独立思考,深入研究,分析问题、解决问题的能力。

3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。

4、通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。

二、根据我在实习中遇到得问题,我将在以后的学习过程中注意以下几点:

1、认真上好专业实验课,多在实践中锻炼自己。

2、写程序的过程中要考虑周到,严密。

3、在做设计的时候要有信心,有耐心,切勿浮躁。

4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。

5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。

 

实验二迷宫问题

1课程设计的目的

(1)熟练使用C语言编写程序,解决实际问题;

(2)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;

(3)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;

(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

2需求分析

3课程设计报告内容

1、概要设计

用二维数组摸摸你迷宫地图,找出一条从迷宫的入口到出口的通路(如果存在通路)。

在迷宫中行进时必须遵循三个原则:

1.每一步只走一格;

2.遇到死胡同时退回一步,看是否有其他的路可以走;

3.走过的路不会再走第二次。

2、详细设计

数字构成迷宫:

用一个二维数组模拟迷宫地图,如图(A)所示,0表示可以通行,1表示墙壁,无法通过。

为了方便处理边界,可以在迷宫的四周加设围墙,如图(B)所示。

 

用回溯法来求解迷宫问题:

 

首先从入口出发,按东南西北的次序依次向下一步探索,若未走过且能通过,则前进一步进入下一位置;否则试探下一个方向。

若所有的方向均没有通路,则将该点标为死胡同并沿原路退回到前一步,再换下一个方向继续试探。

直到找到一条通路,或无路可走返回到入口。

 

一个栈来保存当前所走线路沿途的每一个位置的坐标以及从该位置前进的方向,而栈顶的位置便是当前的位置。

当到达出口时,栈中从底到顶即为一条由入口到出口的通路。

路径上的每一步到达的位置用序号(从1开始)编排,称为足迹。

若存在从入口到出口的路径,则程序以足迹的形式输出一条路径。

3、调试分析

4、测试结果

10*6

0111111111

0100100011

0001101001

0110001101

0000100001

1111111110

5、程序清单

源程序

#include

usingnamespacestd;

#include"SqStack.h"

#defineMAXSIZE30//设迷宫的最大行列为30

structPosType//迷宫坐标位置类型

{

intx;//行值

inty;//列值

};

structDataType//栈的元素类型

{

PosTypeseat;//点在迷宫中的"坐标位置"

intdi;//从此点走向下一点的"方向"(0~3表示东~北)

};

classMaze

{

public:

Maze(int,int);

~Maze();

boolMazePath(PosType,PosType);

voidInput();

voidPrint();

private:

PosTypeNextPos(PosType,int);

int**m_maze;//迷宫数组

intm_row;//迷宫的行数

intm_col;//迷宫的列数

};

//构造函数

Maze:

:

Maze(intm,intn)

{

m_row=m+2;

m_col=n+2;

m_maze=newint*[m_row];

for(inti=0;i

m_maze[i]=newint[m_col];

}//Maze

//析构函数

Maze:

:

~Maze()

{

for(inti=0;i

if(m_maze[i]!

=NULL)

delete[]m_maze[i];

if(m_maze!

=NULL)

delete[]m_maze;

}//~Maze

//若迷宫m_maze中存在从入口start到出口end的通路,则求得一条路径

//存放在栈中(从栈底到栈顶),并返回true;否则返回false。

通过路径为足迹(以路径上的序号表示)

boolMaze:

:

MazePath(PosTypestart,PosTypeend)

{

SqStackpath(MAXSIZE);//创建栈

PosTypecurpos;

DataTypee;

curpos=start;

intcurstep=1;//当前足迹,初值为1

do{

if(m_maze[curpos.x][curpos.y]==0){//当前位置可以通过,即是未曾走到过的点

m_maze[curpos.x][curpos.y]=curstep;//留下足迹,迷宫m_maze的curpos点变为序号curstep

e.seat.x=curpos.x;

e.seat.y=curpos.y;

e.di=0;

path.Push(e);//入栈当前位置及方向

curstep++;//足迹加1

if(curpos.x==end.x&&curpos.y==end.y)//到达终点(出口)

returntrue;

curpos=NextPos(curpos,e.di);

}

else{//当前位置不能通过

if(!

path.Empty()){

e=path.Top();//退栈到前一位置

path.Pop();

curstep--;

while(e.di==3&&!

path.Empty()){//该位置已到最后一个方向(北)

m_maze[e.seat.x][e.seat.y]=-1;//留下不能通过的标记(-1)

e=path.Top();//退回一步

path.Pop();

curstep--;

}

if(e.di<3){//没到最后一个方向(北)

e.di++;//换下一个方向探索

path.Push(e);

curstep++;

curpos=NextPos(e.seat,e.di);//设定当前位置是该新方向上的相邻点

}

}

}

}while(!

path.Empty());

returnfalse;

}//MazePath

//输入迷宫

voidMaze:

:

Input()

{

inti,j;

cout<<"请输入"<

"<

for(i=1;i<=m_row-2;i++)

for(j=1;j<=m_col-2;j++)

cin>>m_maze[i][j];

//周边设围墙,定义周边值为1(墙)

for(i=0;i

m_maze[i][0]=1;//行周边

m_maze[i][m_col-1]=1;

}

for(j=1;j

m_maze[0][j]=1;//列周边

m_maze[m_row-1][j]=1;

}

}//Input

//输出迷宫的解

voidMaze:

:

Print()

{

inti,j;

for(i=1;i

for(j=1;j

if(m_maze[i][j]>=0&&m_maze[i][j]<10)//输出对齐

cout<<""<

else

cout<<""<

cout<

}

}//Print

//根据当前点的位置c及移动方向d,返回下一位置,移动方向,依次为东南西北

PosTypeMaze:

:

NextPos(PosTypec,intd)

{

PosTypedirect[4]={{0,1},{1,0},{0,-1},{-1,0}};//{行增量,列增量}

c.x+=direct[d].x;

c.y+=direct[d].y;

returnc;

}//NextPos

intmain()

{

PosTypebegin,end;

intm,n;

cout<<"请输入迷宫的行数,列数:

";

cin>>m>>n;

Mazemaze(m,n);

maze.Input();

cout<<"请输入入口位置(行数,列数):

";

cin>>begin.x>>begin.y;

cout<<"请输入出口位置(行数,列数):

";

cin>>end.x>>end.y;

if(maze.MazePath(begin,end)){//求得一条通路

cout<<"此迷宫从入口到出口的一条路径如下:

"<

maze.Print();//输出此通路

}

else

cout<<"此迷宫没有从入口到出口的路径"<

system("pause");

return0;

}

4小结

一、这次课程设计的心得体会通过实践我的收获如下:

1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。

2、培养了我选用参考书,查阅手册及文献资料的能力。

培养独立思考,深入研究,分析问题、解决问题的能力。

3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。

4、通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。

二、根据我在实习中遇到得问题,我将在以后的学习过程中注意以下几点:

1、认真上好专业实验课,多在实践中锻炼自己。

2、写程序的过程中要考虑周到,严密。

3、在做设计的时候要有信心,有耐心,切勿浮躁。

4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。

5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。

 

实验三Kruskal算法生成最小生成树

1课程设计的目的

2需求分析

编写算法能够建立带权图,并能够用Kruskal算法求该图的最小生成树。

3课程设计报告内容

1、概要设计

Kruskal函数:

先对边集数组排序。

判断是否构成回路,因此还需另有一个判断函数seeks,在Kruskal中调用seeks。

printpath1函数主要用来输出源点到其余各点的最短路径。

2、详细设计

(1)义一个结构体数组,其空间足够大,可将输入的字符串存于数组中。

structedges

{intbv;

inttv;

intw;

};

(2)算法描述

1.Kruskal函数:

因为Kruskal需要一个有序的边集数组,所以要先对边集数组排序。

2.dijkstra函数:

从一个顶点到其余各点的最短路径共有n-1条,因此可以设一变量vnum作为计数器。

该函数的关键在于dist数组的重新置数。

若该顶点是被访问过,并且新起点到该点的权值加上新起点到源点的权值小于该点原权值。

3.printpath1函数:

该函数主要用来输出源点到其余各点的最短路径。

3、调试分析

4、测试结果

课本图5.35进行Kruskal排序

65、程序清单

源程序

#include"stdio.h"

#defineMAXE100

structedges

{intbv;

inttv;

intw;

};

typedefstructedgesedgeset;

intseeks(intset[],intv)

{

inti;

i=v;

while(set[i]>0)

i=set[i];

returni;

}

voidkruskal(edgesetge[],intn,inte)

{

intset[MAXE],v1,v2,i,j;

for(i=1;i

set[i]=0;

i=1;

j=1;

while(j<=e&&i<=n-1)

{

v1=

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

当前位置:首页 > 求职职场 > 简历

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

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