数据结构08图的基本操作

发布 2019-08-30 22:12:40 阅读 3148

院系专业 __网络工程。

姓名___林桢曦学号___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.完成二叉树的应用 统计叶子结点数目,输出叶子结点,求二叉树深度,交换每个结点的左右子树。任选其...