计算机实验报告经典Word文档格式.docx
《计算机实验报告经典Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机实验报告经典Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
(4)以邻接链表为存储结构实现有向图的广度遍历;
三:
实验程序及结果
(1)邻接矩阵建立图:
#include<
stdio.h>
malloc.h>
#defineVEXTYPEint/*顶点的类型设为整型*/
#defineMAXSIZE100/*数组最多存储单元为100*/
#defineADJTYPEint/*边的类型为整型*/
typedefstruct{
VEXTYPEvexs[MAXSIZE];
/*一维数组存储顶点信息*/
ADJTYPEarcs[MAXSIZE][MAXSIZE];
/*二维数组存储邻接矩阵*/
intvexnum,arcnum;
/*顶点和边的数目*/
}MGRAPH;
voidcreate_graph(MGRAPH*g){
inti,j,k;
printf("
输入顶点数和边数:
"
);
scanf("
%d,%d"
&
i,&
j);
g->
vexnum=i;
arcnum=j;
for(i=1;
i<
=g->
vexnum;
i++){/*0单元空出不存储顶点的信息*/
printf("
第%d个顶点的信息:
i);
scanf("
%d"
g->
vexs[i]);
}
i++){/*初始化邻接矩阵*/
for(j=1;
j<
j++)
g->
arcs[i][j]=0;
for(k=1;
k<
arcnum;
k++){
输入第%d条边的起点和终点的编号:
k);
while(i<
1||i>
vexnum||j<
1||j>
vexnum){
printf("
编号超出范围,请重新输入!
scanf("
}
g->
arcs[i][j]=1;
arcs[j][i]=1;
}
main(){
MGRAPHgraph,*g;
inti,j;
g=&
graph;
create_graph(g);
顶点信息为:
\n"
i++){/*输出顶点信息*/
g->
该图的邻接矩阵为:
i++){/*输出邻接矩阵*/
arcs[i][j]);
结果:
(2.)邻接链表建立图:
#defineMAXSIZE100
#defineVEXTYPEint
typedefstructadjnode{
VEXTYPEadjvex;
structadjnode*next;
}ADJNODE;
VEXTYPEvertex;
ADJNODE*link;
}VEXNODE;
VEXNODEadjlist[MAXSIZE];
}ADJGRAPH;
voidcreate_adjgraph(ADJGRAPH*g){/*用邻接链表建立有向图*/
ADJNODE*p;
输入顶点数和边数:
i++){
请输入顶点的信息:
adjlist[i].vertex);
adjlist[i].link=NULL;
请输入第%d条边的起点和终点:
j,&
k);
while(j<
vexnum||k<
1||k>
编号超出范围,请重新输入!
p=(ADJNODE*)malloc(sizeof(ADJNODE));
p->
adjvex=k;
next=g->
adjlist[j].link;
adjlist[j].link=p;
ADJGRAPHgraph,*g;
inti;
create_adjgraph(g);
该有向图的邻接链表为:
i++){/*输出邻接链表*/
p=g->
adjlist[i].link;
if(p!
=NULL){
%3d|"
阿
while(p!
printf("
->
%5d"
p->
adjvex);
p=p->
next;
}
^\n"
else
%3d|^\n"
(3)广度优先遍历:
(此程序用到队列的基本操作,写在头程序中了)
源程序:
#include"
seqqueue.h"
voidcreate_adjgraph(ADJGRAPH*g){/*用邻接链表建立图*/
intvisited[MAXSIZE]={0};
voidbfs(ADJGRAPH*g,inti){/*从顶点i开始进行广度优先搜索*/
SEQQUEUE*q,queue;
intv;
q=&
queue;
Init_Queue(q);
visited[i]=1;
%4d"
Add_Queue(q,i);
while(!
Queue_Empty(q)){
v=Gethead_Queue(q);
Del_Queue(q);
adjlist[v].link;
while(p!
if(visited[p->
adjvex]==0){
visited[p->
adjvex]=1;
adjlist[p->
adjvex].vertex);
Add_Queue(q,p->
p=p->
ADJGRAPH*g,adjg;
adjg;
广度遍历的结果:
if(visited[i]!
=1)
bfs(g,i);
头程序:
seqqueue.h
#definedatatypeint
datatypedata[MAXSIZE];
/*队列的最大存储空间*/
intfront,rear;
/*队头队尾指针*/
}SEQQUEUE;
SEQQUEUE*q;
voidInit_Queue(SEQQUEUE*q){/*初始化队列*/
q->
front=0;
rear=0;
intQueue_Empty(SEQQUEUE*q){/*判断队空操作*/
if(q->
rear==q->
front)
return1;
else
return0;
voidAdd_Queue(SEQQUEUE*q,datatypex){/*入队操作*/
if((q->
rear+1)%MAXSIZE==q->
Queuefull\n"
else{
q->
rear=(q->
rear+1)%MAXSIZE;
data[q->
rear]=x;