图的基本操作与实现的课程设计报告.docx
- 文档编号:9482862
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:13
- 大小:45.33KB
图的基本操作与实现的课程设计报告.docx
《图的基本操作与实现的课程设计报告.docx》由会员分享,可在线阅读,更多相关《图的基本操作与实现的课程设计报告.docx(13页珍藏版)》请在冰豆网上搜索。
图的基本操作与实现的课程设计报告
数据结构
课程设计报告
设计题目:
图的基本操作与实现
专业
班级
学生
学号
指导教师
起止时间
年学期
1.问题描述:
实现图的一些基本操作
2.基本要求:
(1)自选存储结构,输入含n个顶点(用字符表示顶点)和e条边的图G;
(2)求每个顶点的度,输出结果;
(3)指定任意顶点x为初始顶点,对图G作DFS遍历,输出DFS顶点序列(提示:
使用一个栈实现DFS);
(4)指定任意顶点x为初始顶点,对图G作BFS遍历,输出BFS顶点序列(提示:
使用一个队列实现BFS);
(5)输入顶点x,查找图G:
若存在含x的顶点,则删除该结点及与之相关连的边,并作DFS遍历(执行操作3);否则输出信息“无x”;
(6)判断图G是否是连通图,输出信息“YES”/“NO”;
(7)如果选用的存储结构是邻接矩阵,则用邻接矩阵的信息生成图G的邻接表,即复制图G,然再执行操作
(2);反之亦然。
3.测试数据:
有向图的顶点数n和有向图的边数e由用户从键盘敲入
4.算法思想:
(1)自选存储结构创建一个图:
通过用户从键盘敲入的两个数值分别确定图的顶点数和边数,选择邻接矩阵存储结构将图的结点信息存储在一个顺序表中,图的边信息存储在一个二维数组中。
(2)求每个顶点的度:
1.邻接矩阵存储结构下求每个顶点的度:
利用图的邻接矩阵,每个顶点所在行和所在列的边的权值如果存在则该顶点的度+1,依次算出每个顶点的度,并且记录在一个数组中输出。
2.邻接表存储结构下求每个顶点的度:
定义一个邻接边指针循环指向顶点的邻接边单链表头结点,当结点不空时,该顶点的出度+1,邻接边弧头结点的入度+1,依次求出每个顶点的出度和入度之和就为该顶点的度。
(3)图的深度优先遍历:
采取邻接矩阵结构,指定任意顶点x为初始顶点
1.访问结点v并标记结点v已访问;
2.查找结点v的第一个邻接结点w;
3.若结点v的邻接结点w存在,则继续执行,否则算法结束;
4.若结点w尚未被访问,则递归访问结点w;
5.查找结点v的w邻接结点的下一个邻接结点w,转到步骤3。
(4)图的广度优先遍历:
采取邻接矩阵结构,指定任意顶点x为初始顶点,利用顺序循环队列以保持访问过的结点的顺序
1.首先访问初始结点v并标记结点v为已访问;
2.结点v入队列;
3.当队列非空时则继续执行,否则算法结束;
4.出队列取得队头结点u;
5.查找u的第一个邻接结点w;
6.若u的邻接结点w不存在则转到步骤3,否则循环执行下列步骤:
若结点w尚未被访问,则访问结点w并标记结点w为已访问;
结点w入队列;
查找结点u的w邻接结点的下一个邻接结点w,转到步骤6。
(5)判断有向图的强连通性:
采取邻接表结构,在图中寻找一个包含所有顶点且首尾相连的环,若这样的环存在,则该图为强连通图,否则不为强连通图。
(6)用邻接矩阵的信息生成邻接表:
定义一个邻接表的边信息结构体,将邻接矩阵的边信息转换成邻接表的边信息存储到邻接边的单链表中。
5.模块划分:
mian():
主函数模块。
在主函数模块中调用以下函数:
(1)voidCreatGraph(AdjMGraph*G,DataTypev[],intn,RowColWeightE[],inte):
创建一个邻接矩阵存储结构的图;
(2)voidPrint(AdjMGraph*G):
输出图的邻接矩阵;
(3)voidMVertices(AdjMGraph*G,DataTypea[]):
求出邻接矩阵存储结构下图的每个顶点的度;
(4)voidCreatLGraph(AdjLGraph*G,DataTypev[],intn,RowCold[],inte):
用邻接矩阵的信息生成邻接表;
(5)voidLVertices(AdjLGraph*G,DataTypea[]):
求出邻接表存储结构下图的每个顶点的度;
(6)intLianTong(AdjLGraph*G,DataTypea[]):
判断有向图的强连通性;
(7)voidDepthFirstSearch(AdjMGraphG,voidVisit(DataTypeitem)):
对图作DFS遍历,输出DFS顶点序列;
(8)voidBroadFirstSearch(AdjMGraphG,voidVisit(DataTypeitem)):
对图作BFS遍历,输出BFS顶点序列;
(9)intChaZhao(AdjMGraph*G,intv):
查找顶点v;
(10)voidMDelete(AdjMGraph*G,intv):
删除查找到的结点v并删除该结点及与之相关的边;
6.数据结构:
(1)有向图顶点的数据类型DataType定义如下:
typedefintDataType;
(2)邻接矩阵存储结构下图的结构体定义如下:
typedefstruct
{
SeqListVertices;能模块图:
8.源程序:
源程序存放在八个文件夹中,文件是顺序表的结构体定义和操作函数,文件是顺序循环队列的结构体定义和操作函数,文件是邻接矩阵存储结构下图的结构体定义和操作函数,文件是邻接矩阵存储结构下图的创建函数,文件是邻接表存储结构下图的结构体定义和操作函数,文件是邻接表存储结构下图的创建函数,文件是邻接矩阵存储结构下图的深度优先遍历和广度优先遍历操作函数,文件图的基本操作与实现.c是主函数。
(1)/*文件*/
typedefstruct
{
DataTypelist[MaxSize];
intsize;
}SeqList;
voidListInitiate(SeqList*L)
{
L->size=0;
}
intListLength(SeqListL)
{
return;
}
intListInsert(SeqList*L,inti,DataTypex)
{
intj;
if(L->size>=MaxSize)
{
printf("数组已满无法插入!
\n");
return0;
}
elseif(i<0||i>L->size)
{
printf("参数不合法!
\n");
return0;
}
else
{
for(j=L->size;j>i;i--)L->list[j]=L->list[j-1];
L->list[i]=x;
L->size++;
return1;
}
}
intListDelete(SeqList*L,inti,DataType*x)
{
intj;
if(L->size<=0)
{
printf("顺序表已空无数据元素可删!
\n");
return0;
}
elseif(i<0||i>L->size-1)
{
printf("参数i不合法!
\n");
return0;
}
else
{
*x=L->list[i];
for(j=i+1;j<=L->size-1;j++)L->list[j-1]=L->list[j];
L->size--;
return1;
}
}
intListGet(SeqListL,inti,DataType*x)
{
if(i<0||i>
{
printf("参数i不合法!
\n");
return0;
}
else
{
*x=[i];
return1;
}
}
(2)/*文件*/
typedefstruct
{
DataTypequeue[MaxQueueSize];
intrear;
intfront;
intcount;
}SeqCQueue;
voidQueueInitiate(SeqCQueue*Q)
{
Q->rear=0;
Q->front=0;
Q->count=0;
}
intQueueNotEmpty(SeqCQueueQ)
{
if!
=0)return1;
elsereturn0;
}
intQueueAppend(SeqCQueue*Q,DataTypex)
{
if(Q->count>0&&Q->rear==Q->front)
{
printf("队列已满无法插入!
");
return0;
}
else
{
Q->queue[Q->rear]=x;
Q->rear=(Q->rear+1)%MaxQueueSize;
Q->count++;
return1;
}
}
intQueueDelete(SeqCQueue*Q,DataType*d)
{
if(Q->count==0)
{
printf("队列已空无数据出队列!
\n");
return0;
}
else
{
*d=Q->queue[Q->front];
Q->front=(Q->front+1)%MaxQueueSize;
Q->count--;
return1;
}
}
intQueueGet(SeqCQueueQ,DataType*d)
{
if==0)
{
printf("队列已空无数据出队列!
\n");
return0;
}
else
{
*d=[];
return1;
}
}
(3)/*文件*/
#include""
typedefstruct
{
SeqListVertices;ow,E[k].col,E[k].weight);orce=i;
G->a[i].adj=NULL;
}
}
dj;
while(p!
=NULL)
{
q=p->next;
free(p);
p=q;
}
}
}
ata=vertex;dj;dj=p;dj;
while(curr!
=NULL&&curr->dest!
=v2)
dj=curr->next;
free(curr);
G->numOfEdges--;
}
elseif(curr!
=NULL&&curr->dest==v2&&pre!
=NULL)
dj;
if(p!
=NULL)
returnp->dest;dj;
while(p!
=NULL)dj;dj;
while(q!
=NULL)
{
b[i]++;
q=q->next;
}
}
for(i=0;i
{
if(b[i]==1)
k++;
}
p=G->a[G->numOfVerts-1].adj;
if(k==G->numOfVerts&&p->dest==a[0])
return1;
else
return0;
}
(6)/*文件*/
typedefstruct
{
introw;ow,d[k].col);
}
(7)/*文件*/
voidVisit(DataTypeitem)
{
printf("%d",item);
}
voidDepthFSearch(AdjMGraphG,intv,intvisited[],voidVisit(DataTypeitem))
*/
#include<>
#include<>
#include<>
typedefintDataType;ow,&rcw[i].col,&rcw[i].weight);
}
CreatGraph(&g1,a,n,rcw,e);ol=rcw[i].col;
rwc[i].row=rcw[i].row;
}
CreatLGraph(&g2,a,得体会:
在本次数据结构的课程设计中我设计的题目是图的基本操作与实现,经过了10天反复的分析和调试运行,我更加深入地学习了图的相关内容,也更加熟练地掌握了图的一些基本操作,如自选存储结构创建一个图,求不同的存储结构下图的各顶点的度,顶点的查找与删除,图的遍历操作和有向图的强连通性的判断,因为图的邻接表存储结构设计到了指针的用法,我也再次巩固了指针方面的内容,也能够自己编写程序巧妙运用指针,在本次课程设计中我也存在一些不足,如把强连通图和完全强连通图的性质弄混淆,各功能函数相互调用的时候弄错了实参与形参等等,总之本次数据机构的课程设计提高了我的程序设计能力,算法分析能力和调试能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基本 操作 实现 课程设计 报告
