院系专业 __网络工程。
姓名___林桢曦学号___106052010235**。
级班年___月___日。
图的基本操作。
编写图基本操作函数,建立图的邻接表,邻接矩阵。邻接表表示的图的递归深度优先遍历,邻接矩阵表示的图的递归深度优先遍历,邻接表表示的图的广度优先遍历,邻接矩阵表示的图的广度优先遍历。并调用上述函数实现相关操作。
1) 为了实现上述程序功能,需要定义一个简化的线性表抽象数据类型:
adt graphvr=
基本操作:create_graph(lgraph lg,mgraph mg)
操作前提:lg是一个邻接表表示的图,mg是一个邻接矩阵表示的图。
操作结果:建立图的邻接表,邻接矩阵。
ldfs(lgraph g,int i)
操作前提:g是一个已初始化的邻接表表示的图。
操作结果:对图g进行递归深度优先遍历。
mdfs(mgraph g,int i,int vn)
操作前提:g是一个已初始化的邻接矩阵表示的图。
操作结果:对图进行递归深度优先遍历。
lbfs(lgraph g,int s,int n)
操作前提:g是一个已初始化的邻接表表示的图。
操作结果:对图进行递归深度优先遍历。
mbfs(mgraph g,int s,int n)
操作前提:g是一个已初始化的邻接矩阵表示的图。
操作结果:对图进行递归深度优先遍历。
2) 本程序包含6个函数:
主函数main()
建立图的邻接表,邻接矩阵函数create_graph()
邻接表表示的图的递归深度优先遍历函数ldfs()
邻接矩阵表示的图的递归深度优先遍历函数mdfs()
邻接表表示的图的广度优先遍历lbfs()
邻接矩阵表示的图的广度优先遍历mbfs()
各函数间调用关系如下:主函数调用其他函数。
3) 主函数的伪码。
main()
定义变量lgraph lg;
mgraph mg;
int n,i;
令n=create_graph(lg,mg);
for循环(i=0;ivisited[i]=0;
printf("邻接表表示的图的递归深度优先遍历");
调用ldfs(lg,0);
getch();
for循环(i=0;ivisited[i]=0;
printf("邻接矩阵表示的图的递归深度优先遍历");
调用mdfs(mg,0,n);
getch();
printf("邻接表表示的图的广度优先遍历");
调用lbfs(lg,0,n);
getch();
printf("邻接矩阵表示的图的广度优先遍历");
调用mbfs(mg,0,n);
1) 类型定义。
typedef struct node
2.递归深度优先遍历输出图的邻接表。
ldfs(lgraph g,int i)
定义变量edgenode *t;
printf("%4d",i+1);
visited[i]=1;
t=g[i];
while循环(t!=null){
如果(visited[t->vno]==0)
调用ldfs(g,t->vno);
t=t->next;
3.递归深度优先遍历输出图的邻接矩阵。
mdfs(mgraph g,int i,int vn)
定义变量int j;
printf("%4d",i+1);
visited[i]=1;
for循环(j=0;j如果(g[i][j]==1&&visited[j]==0)
调用mdfs(g,j,vn);
4.图的广度优先遍历输出图的邻接表。
lbfs(lgraph g,int s,int n){
定义变量int i,v,w,head,tail;
edgenode *t;
for循环(i=0;ivisited[i]=0;
head=tail=0;
输出("%4d",s+1);
visited[s]=1;
queue[tail]=s;
while循环(headv=queue[head++]
for循环(t=g[v];t!=null;t->next){
w=t->vno;
如果(visited[w]==0){
输出("%4d",w+1);
visited[w]=1;
queue[tail++]w;
5.图的广度优先遍历输出图的邻接矩阵。
mbfs(mgraph g,int s,int n){
定义变量int i,j,v,head,tail;
for循环(i=0;ivisited[i]=0;
head=tail=0;
输出("%4d",s+1);
visited[s]=1;
queue[tail++]s;
while循环(headv=queue[head++]
for循环(j=0;j如果(g[v][j]==1&&visited[j]==0){
输出("%4d",j+1);
visited[j]=1;
queue[tail++]j;
调试中遇到分号在中文输入情况下输入,调试不通过,还有空指针问题。
略)按要求输入图的顶点数,在输入图的边数,接着输入相连两条边的顶点,输入范围屏幕有显示,最后屏幕显示四种遍历结果。
数据结构。源程序文件如下:
#include ""
#include ""
#include ""
#define max 10
typedef struct node {
int vno;
struct node *next;
edgenode;
typedef edgenode *lgraph[max];
typedef int mgraph[max][max];
int visited[max];
int queue[max];
int create_graph(lgraph lg,mgraph mg)
int vn,en,k,i,j;
edgenode *p;
while(1){
vn=en=0;
printf("输入图的顶点数[1-10]");
fflush(stdin);
scanf("%d",&vn);
if(vn<1||vn>10)
continue;
printf("输入图的边数[0-%d]",vn*(vn-1)/2);
scanf("%d",&en);
if(en>=0&&en<=vn*(vn-1)/2)
break;
for(k=0;klg[k]=null;
for(k=0;kfor(i=0;img[k][i]=0;
for(k=0;ki=j=-1;
printf("输入一对相连的两条边[1-%d]的顶点:",vn);
scanf("%d%d",&i,&j);
if(i<1||j<1||i>vn||j>vn){
printf("输入错误,边范围为[1-%d]",vn);
continue;
k++;i--;
j--;p=(edgenode *)malloc(sizeof(edgenode));
p->vno=j;
p->next=lg[i];
lg[i]=p;
p=(edgenode *)malloc(sizeof(edgenode));
数据结构与算法 图结构的操作
数据结构与算法分析 课程实验报告。实验目的 1.理解图形结构的逻辑和存储特点。2.掌握图形结构遍历递归算法。实验内容 1.用邻接矩阵或者邻接表存储一个图形结构。2.采用深度或者广度优先搜索算法,遍历一个图,并输出遍历结果。实验方式 个人实验。实验设备与环境 pc机,windows xp操作系统,vc...
数据结构中顺序表的基本操作
头文件。include include include 函数返回状态 define ok 1 define error 0 define true 1 define false 0 define infeasible 1 define overflow 2 运用动态分配的顺序存储结构。define ...
数据结构与算法 树结构的操作
数据结构与算法分析 课程实验报告。实验目的 1.理解树形结构的逻辑和存储特点。2.掌握二叉树的遍历递归算法。实验内容 1.用递归算法实现二叉树的建立,并能输出遍历序列结果 先序 中序 后序任意一种即可 2.完成二叉树的应用 统计叶子结点数目,输出叶子结点,求二叉树深度,交换每个结点的左右子树。任选其...