实验7 图的表示与遍历Word格式.docx

上传人:b****3 文档编号:16053601 上传时间:2022-11-18 格式:DOCX 页数:17 大小:268.23KB
下载 相关 举报
实验7 图的表示与遍历Word格式.docx_第1页
第1页 / 共17页
实验7 图的表示与遍历Word格式.docx_第2页
第2页 / 共17页
实验7 图的表示与遍历Word格式.docx_第3页
第3页 / 共17页
实验7 图的表示与遍历Word格式.docx_第4页
第4页 / 共17页
实验7 图的表示与遍历Word格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

实验7 图的表示与遍历Word格式.docx

《实验7 图的表示与遍历Word格式.docx》由会员分享,可在线阅读,更多相关《实验7 图的表示与遍历Word格式.docx(17页珍藏版)》请在冰豆网上搜索。

实验7 图的表示与遍历Word格式.docx

typedefstruct/*图的邻接矩阵*/

{

intvexnum,arcnum;

charvexs[N];

intarcs[N][N];

graph;

voidcreateGraph(graph*g);

/*建立一个无向图的邻接矩阵*/

voiddfs(inti,graph*g);

/*从第i个顶点出发深度优先搜索*/

voidtdfs(graph*g);

/*深度优先搜索整个图*/

voidbfs(intk,graph*g);

/*从第k个顶点广度优先搜索*/

voidtbfs(graph*g);

/*广度优先搜索整个图*/

voidinit_visit();

/*初始化访问标识数组*/

voidcreateGraph(graph*g)/*建立一个无向图的邻接矩阵*/

{inti,j;

charv;

g-〉vexnum=0;

g—>

arcnum=0;

i=0;

printf(”输入顶点序列(以#结束):

\n”);

while((v=getchar())!

=’#'

g—〉vexs[i]=v;

/*读入顶点信息*/

i++;

vexnum=i;

/*顶点数目*/

for(i=0;

i〈g-〉vexnum;

i++)/*邻接矩阵初始化*/

for(j=0;

j〈g-〉vexnum;

j++)

g-〉arcs[i][j]=0;

printf(”输入边的信息:

scanf("

%d,%d”,&i,&j);

/*读入边i,j*/

while(i!

=-1)/*读入i,j为-1时结束*/

arcs[i][j]=1;

g—〉arcs[j][i]=1;

scanf(”%d,%d”,&i,&j);

}

voiddfs(inti,graph*g)/*从第i个顶点出发深度优先搜索*/

intj;

printf(”%c"

g-〉vexs[i]);

visited[i]=TRUE;

j〈g—>

vexnum;

if((g-〉arcs[i][j]==1)&&

(!

visited[j]))

dfs(j,g);

voidtdfs(graph*g)/*深度优先搜索整个图*/

inti;

printf(”\n从顶点%C开始深度优先搜索序列:

"

g-〉vexs[0]);

for(i=0;

i<

g—>

i++)

if(visited[i]!

=TRUE)

dfs(i,g);

voidbfs(intk,graph*g)/*从第k个顶点广度优先搜索*/

inti,j;

queueqlist,*q;

q=&qlist;

q-〉rear=0;

q—〉front=0;

printf("

%c”,g->

vexs[k]);

visited[k]=TRUE;

q-〉data[q—〉rear]=k;

q—〉rear=(q—〉rear+1)%N;

while(q->

rear!

=q—〉front)

i=q—>

data[q—>

front];

q-〉front=(q—>

front+1)%N;

if((g—>

arcs[i][j]==1)&&(!

visited[j]))

printf(”%c”,g->

vexs[j]);

visited[j]=TRUE;

q->

rear]=j;

q—>

rear=(q—〉rear+1)%N;

voidtbfs(graph*g)/*广度优先搜索整个图*/

inti;

\n从顶点%C开始广度优先搜索序列:

”,g-〉vexs[0]);

for(i=0;

i〈g—>

vexnum;

if(visited[i]!

bfs(i,g);

voidinit_visit()/*初始化访问标识数组*/

N;

visited[i]=FALSE;

intmain()

graphga;

createGraph(&ga);

无向图的邻接矩阵:

\n"

);

for(i=0;

i〈ga。

for(j=0;

j〈ga。

printf(”%3d”,ga.arcs[i][j]);

\n”);

init_visit();

tdfs(&ga);

tbfs(&ga);

return0;

▪根据右图的结构验证实验,输入:

ABCDEFGH#

0,1

0,2

0,5

1,3

1,4

2,5

2,6

3,7

4,7

—1,—1

▪运行结果:

 

2、阅读并运行下面程序,补充拓扑排序算法。

#include〈stdio。

h〉

#include<

malloc.h〉

#defineN20

typedefstructedgenode{/*图的邻接表:

邻接链表结点*/

intadjvex;

/*顶点序号*/

structedgenode*next;

/*下一个结点的指针*/

}edgenode;

typedefstructvnode{/*图的邻接表:

邻接表*/

chardata;

/*顶点信息*/

intind;

/*顶点入度*/

structedgenode*link;

/*指向邻接链表指针*/

}vnode;

voidcreateGraph_list(vnodeadjlist[],int*p);

/*建立有向图的邻接表*/

voidtopSort(vnodeg[],intn);

/*拓扑排序*/

voidcreateGraph_list(vnodeadjlist[],int*p){/*建立有向图的邻接表*/

inti,j,n,e;

charv;

edgenode*s;

i=0;

n=0;

e=0;

输入顶点序列(以#结束):

=’#’)

adjlist[i].data=v;

/*读入顶点信息*/

adjlist[i]。

link=NULL;

ind=0;

n=i;

*p=n;

/*建立邻接链表*/

printf(”\n请输入弧的信息(i=—1结束):

i,j:

scanf(”%d,%d”,&i,&j);

while(i!

=—1){

s=(structedgenode*)malloc(sizeof(edgenode));

s—>

adjvex=j;

s—〉next=adjlist[i]。

link;

adjlist[i].link=s;

adjlist[j].ind++;

/*顶点j的入度加1*/

e++;

scanf(”%d,%d”,&

i,&j);

printf(”邻接表:

”);

i〈n;

i++){/*输出邻接表*/

\n%c,%d:

”,adjlist[i].data,adjlist[i].ind);

s=adjlist[i].link;

while(s!

=NULL){

—>

%d”,s—>

adjvex);

s=s—〉next;

}

voidtopSort(vnodeg[],intn){/*拓扑排序*/

intmain(){

vnodeadjlist[N];

intn,*p;

p=&n;

createGraph_list(adjlist,p);

return0;

▪根据输入,输出有向图的拓扑排序序列。

并画出有向图.输入:

ABCDEF#

1,2

2,3

4,1

4,5

3、阅读并运行下面程序.

#defineTRUE1

#defineINF32766/*邻接矩阵中的无穷大元素*/

#defineINFIN32767/*比无穷大元素大的数*/

typedefstruct

{/*图的邻接矩阵*/

intvexnum,arcnum;

charvexs[N];

intarcs[N][N];

voidcreateGraph_w(graph*g,intflag);

voidprim(graph*g,intu);

voiddijkstra(graphg,intv);

voidshowprim();

voidshowdij();

/*建带权图的邻接矩阵,若flag为1则为无向图,flag为0为有向图*/

voidcreateGraph_w(graph*g,intflag)

inti,j,w;

charv;

g—〉vexnum=0;

g—〉arcnum=0;

=’#’)

g—〉vexs[i]=v;

i++;

g—〉vexnum=i;

i〈6;

i++)/*邻接矩阵初始化*/

j〈6;

g->

arcs[i][j]=INF;

scanf(”%d,%d,%d”,&i,&j,&w);

/*读入边(i,j,w)*/

=—1)/*读入i为-1时结束*/

g-〉arcs[i][j]=w;

if(flag==1)

g-〉arcs[j][i]=w;

scanf(”%d,%d,%d"

&i,&

j,&w);

voidprim(graph*g,intu)/*出发顶点u*/

intlowcost[N],closest[N],i,j,k,min;

g->

i++)/*求其他顶点到出发顶点u的权*/

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

当前位置:首页 > 法律文书 > 调解书

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

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