数据结构
课程设计报告设计题目:图的基本操作与实现
专业
班级
学生
学号
指导教师
起止时间
年学期
目录
1.问题描述:实现图的一些基本操作..... 错误!未定义书签。
2.基本要求:......................... 错误!未定义书签。
(2)求每个顶点的度,输出结果;......... 错误!未定义书签。
3.测试数据:......................... 错误!未定义书签。
4.算法思想:......................... 错误!未定义书签。
(1)自选存储结构创建一个图:........ 错误!未定义书签。
(2)求每个顶点的度:................ 错误!未定义书签。
(3)图的深度优先遍历:.............. 错误!未定义书签。
(4)图的广度优先遍历:.............. 错误!未定义书签。
(5)判断有向图的强连通性:.......... 错误!未定义书签。
(6)用邻接矩阵的信息生成邻接表:.... 错误!未定义书签。
6.数据结构:......................... 错误!未定义书签。
7.功能模块图......................... 错误!未定义书签。
8.源程序:........................... 错误!未定义书签。
9.心得体会:......................... 错误!未定义书签。
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)void CreatGraph(AdjMGraph *G,DataType v[],int
n,RowColWeight E[],int e):创建一个邻接矩阵存储结构的图;
(2)void Print(AdjMGraph *G):输出图的邻接矩阵;
(3)void MVertices(AdjMGraph *G,DataType a[]):求出邻接矩阵
存储结构下图的每个顶点的度;
(4)void CreatLGraph(AdjLGraph *G,DataType v[],int n,RowCol
d[],int e):用邻接矩阵的信息生成邻接表;
(5)void LVertices(AdjLGraph *G,DataType a[]):求出邻接表存
储结构下图的每个顶点的度;
(6)int LianTong(AdjLGraph *G,DataType a[]):判断有向图的强
连通性;
(7)void DepthFirstSearch(AdjMGraph G,void Visit(DataType
item)):对图作DFS遍历,输出DFS顶点序列;
(8)void BroadFirstSearch(AdjMGraph G,void Visit(DataType
item)):对图作BFS遍历,输出BFS顶点序列;
(9)int ChaZhao(AdjMGraph *G,int v):查找顶点v;
(10)void MDelete(AdjMGraph *G,int v):删除查找到的结点v并删
除该结点及与之相关的边;
6.数据结构:
(1)有向图顶点的数据类型DataType 定义如下:
typedef int DataType ;
(2)邻接矩阵存储结构下图的结构体定义如下:
typedef struct
{
SeqList Vertices;能模块图:
8.源程序:
源程序存放在八个文件夹中,文件是顺序表的结构体定义和操作函数,文件是顺序循环队列的结构体定义和操作函数,文件是邻接矩阵存储结构下图的结构体定义和操作函数,文件是邻接矩阵存储结构下图的创建函数,文件是邻接表存储结构下图的结构体定义和操作函数,文件是邻接表存储结构下图的创建函数,文件是邻接矩阵存储结构下图的深度优先遍历和广度优先遍历操作函数,文件图的基本操作与实现.c是主函数。
(1)/* 文件*/
typedef struct
{
DataType list[MaxSize];
int size;
}SeqList;
void ListInitiate(SeqList *L)
{
L->size=0;
}
int ListLength(SeqList L)
{
return ;
}
int ListInsert(SeqList *L,int i,DataType x)
{
int j;
if(L->size>=MaxSize)
{
printf("数组已满无法插入!\n");
return 0;
}
else if(i<0||i>L->size)
{
printf("参数不合法!\n");
return 0;
}
else
{
for(j=L->size;j>i;i--)L->list[j]=L->list[j-1];
L->list[i]=x;
L->size++;
return 1;
}
}
int ListDelete(SeqList *L,int i,DataType *x)
{
int j;
if(L->size<=0)
{
printf("顺序表已空无数据元素可删!\n");
return 0;
}
else if(i<0||i>L->size-1)
{
printf("参数i不合法!\n");
}
else
{
*x=L->list[i];
for(j=i+1;j<=L->size-1;j++)L->list[j-1]=L->list[j];
L->size--;
return 1;
}
}
int ListGet(SeqList L,int i,DataType *x)
{
if(i<0||i>
{
printf("参数i不合法!\n");
return 0;
}
else
{
*x=[i];
return 1;
}
}
(2)/* 文件*/
typedef struct
{
DataType queue[MaxQueueSize];
int rear;
int front;
int count;
}SeqCQueue;
void QueueInitiate(SeqCQueue *Q)
{
Q->rear=0;
Q->front =0;
Q->count =0;
}
int QueueNotEmpty(SeqCQueue Q)
{
if !=0) return 1;
}
int QueueAppend(SeqCQueue *Q,DataType x)
{
if(Q->count>0&&Q->rear==Q->front)
{
printf("队列已满无法插入!");
return 0;
}
else
{
Q->queue [Q->rear]=x;
Q->rear =(Q->rear +1)%MaxQueueSize;
Q->count ++;
return 1;
}
}
int QueueDelete(SeqCQueue *Q,DataType *d) {
if(Q->count ==0)
{
printf("队列已空无数据出队列!\n");
return 0;
}
else
{
*d=Q->queue[Q->front];
Q->front=(Q->front+1)%MaxQueueSize;
Q->count --;
return 1;
}
}
int QueueGet(SeqCQueue Q,DataType*d)
{
if ==0)
{
printf("队列已空无数据出队列!\n");
return 0;
}
else
{
*d= [ ];
return 1;
}
}
(3)/* 文件*/
#include""
typedef struct
{
SeqList Vertices; 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--;
}
else if(curr!=NULL&&curr->dest==v2&&pre!=NULL)
dj;
if(p!=NULL)
return p->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])
return 1;
else
return 0;
}
(6)/* 文件*/
typedef struct
{
int row; ow,d[k].col);
}
(7)/* 文件*/
void Visit(DataType item)
{
printf("%d ",item);
}
void DepthFSearch(AdjMGraph G,int v,int visited[],void Visit(DataType item))
*/
#include<>
#include<>
#include<>
typedef int DataType;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天反复的分析和调试运行,我更加深入地学习了图的相关内容,也更加熟练地掌握了图的一些基本操作,如自选存储结构创建一个图,求不同的存储结构下图的
各顶点的度,顶点的查找与删除,图的遍历操作和有向图的强连通性的判断,因为图的邻接表存储结构设计到了指针的用法,我也再次巩固了指针方面的内容,也能够自己编写程序巧妙运用指针,在本次课程设计中我也存在一些不足,如把强连通图和完全强连通图的性质弄混淆,各功能函数相互调用的时候弄错了实参与形参等等,总之本次数据机构的课程设计提高了我的程序设计能力,算法分析能力和调试能力。