实验7 图的表示与遍历Word格式.docx
《实验7 图的表示与遍历Word格式.docx》由会员分享,可在线阅读,更多相关《实验7 图的表示与遍历Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
![实验7 图的表示与遍历Word格式.docx](https://file1.bdocx.com/fileroot1/2022-11/18/5300fcd5-0f2c-47cd-bf49-fb8487e180f4/5300fcd5-0f2c-47cd-bf49-fb8487e180f41.gif)
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的权*/