计算机实验报告经典.docx
《计算机实验报告经典.docx》由会员分享,可在线阅读,更多相关《计算机实验报告经典.docx(14页珍藏版)》请在冰豆网上搜索。
![计算机实验报告经典.docx](https://file1.bdocx.com/fileroot1/2022-10/27/192fd1c1-31f5-45e1-87fb-0210f949eeb3/192fd1c1-31f5-45e1-87fb-0210f949eeb31.gif)
计算机实验报告经典
中国矿业大学矿业工程学院
实验报告
课程名称计算机软件设计基础
姓名黄开文班级采矿09-8班
学号01090253日期2011年10月
成绩教师谢耀社
实验三:
图的存储与遍历
一:
实验目的
(1)掌握图的概念和相关术语;
(2)掌握图的邻接矩阵和邻接链表表示;
(3)掌握图的两种遍历方式:
深度遍历和广度遍历。
二:
实验内容
(1)使用邻接矩阵作为存储结构建立无向图;
(2)使用邻接链表作为存储结构建立有向图;
(3)以邻接链表为存储结构实现图有向图的深度遍历;
(4)以邻接链表为存储结构实现有向图的广度遍历;
三:
实验程序及结果
(1)邻接矩阵建立图:
#include
#include
#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;
g->arcnum=j;
for(i=1;i<=g->vexnum;i++){/*0单元空出不存储顶点的信息*/
printf("第%d个顶点的信息:
",i);
scanf("%d",&g->vexs[i]);
}
for(i=1;i<=g->vexnum;i++){/*初始化邻接矩阵*/
for(j=1;j<=g->vexnum;j++)
g->arcs[i][j]=0;
}
for(k=1;k<=g->arcnum;k++){
printf("输入第%d条边的起点和终点的编号:
",k);
scanf("%d,%d",&i,&j);
while(i<1||i>g->vexnum||j<1||j>g->vexnum){
printf("编号超出范围,请重新输入!
");
scanf("%d,%d",&i,&j);
}
g->arcs[i][j]=1;
g->arcs[j][i]=1;
}
}
main(){
MGRAPHgraph,*g;
inti,j;
g=&graph;
create_graph(g);
printf("顶点信息为:
\n");
for(i=1;i<=g->vexnum;i++){/*输出顶点信息*/
printf("%d",g->vexs[i]);}
printf("\n");
printf("该图的邻接矩阵为:
\n");
for(i=1;i<=g->vexnum;i++){/*输出邻接矩阵*/
for(j=1;j<=g->vexnum;j++)
printf("%d",g->arcs[i][j]);
printf("\n");
}
}
结果:
(2.)邻接链表建立图:
#include
#include
#defineMAXSIZE100
#defineVEXTYPEint
typedefstructadjnode{
VEXTYPEadjvex;
structadjnode*next;
}ADJNODE;
typedefstruct{
VEXTYPEvertex;
ADJNODE*link;
}VEXNODE;
typedefstruct{
VEXNODEadjlist[MAXSIZE];
intvexnum,arcnum;
}ADJGRAPH;
voidcreate_adjgraph(ADJGRAPH*g){/*用邻接链表建立有向图*/
inti,j,k;
ADJNODE*p;
printf("输入顶点数和边数:
");
scanf("%d,%d",&i,&j);
g->vexnum=i;
g->arcnum=j;
for(i=1;i<=g->vexnum;i++){
printf("请输入顶点的信息:
");
scanf("%d",&g->adjlist[i].vertex);
g->adjlist[i].link=NULL;
}
for(i=1;i<=g->arcnum;i++){
printf("请输入第%d条边的起点和终点:
",i);
scanf("%d,%d",&j,&k);
while(j<1||j>g->vexnum||k<1||k>g->vexnum){
printf("编号超出范围,请重新输入!
");
scanf("%d,%d",&i,&j);
}
p=(ADJNODE*)malloc(sizeof(ADJNODE));
p->adjvex=k;
p->next=g->adjlist[j].link;
g->adjlist[j].link=p;
}
}
main(){
ADJGRAPHgraph,*g;
inti;
ADJNODE*p;
g=&graph;
create_adjgraph(g);
printf("该有向图的邻接链表为:
\n");
for(i=1;i<=g->vexnum;i++){/*输出邻接链表*/
p=g->adjlist[i].link;
if(p!
=NULL){
printf("%3d|",g->adjlist[i].vertex);阿
while(p!
=NULL){
printf("->");
printf("%5d",p->adjvex);
p=p->next;
}
printf("^\n");
}
else
printf("%3d|^\n",g->adjlist[i].vertex);
}
}
结果:
(3)广度优先遍历:
(此程序用到队列的基本操作,写在头程序中了)
源程序:
#include
#include"seqqueue.h"
#include
#defineMAXSIZE100
#defineVEXTYPEint
typedefstructadjnode{
VEXTYPEadjvex;
structadjnode*next;
}ADJNODE;
typedefstruct{
VEXTYPEvertex;
ADJNODE*link;
}VEXNODE;
typedefstruct{
VEXNODEadjlist[MAXSIZE];
intvexnum,arcnum;
}ADJGRAPH;
voidcreate_adjgraph(ADJGRAPH*g){/*用邻接链表建立图*/
inti,j,k;
ADJNODE*p;
printf("输入顶点数和边数:
");
scanf("%d,%d",&i,&j);
g->vexnum=i;
g->arcnum=j;
for(i=1;i<=g->vexnum;i++){
printf("请输入顶点的信息:
");
scanf("%d",&g->adjlist[i].vertex);
g->adjlist[i].link=NULL;
}
for(i=1;i<=g->arcnum;i++){
printf("请输入第%d条边的起点和终点:
",i);
scanf("%d,%d",&j,&k);
while(j<1||j>g->vexnum||k<1||k>g->vexnum){
printf("编号超出范围,请重新输入!
");
scanf("%d,%d",&i,&j);
}
p=(ADJNODE*)malloc(sizeof(ADJNODE));
p->adjvex=k;
p->next=g->adjlist[j].link;
g->adjlist[j].link=p;
}
}
intvisited[MAXSIZE]={0};
voidbfs(ADJGRAPH*g,inti){/*从顶点i开始进行广度优先搜索*/
ADJNODE*p;
SEQQUEUE*q,queue;
intv;
q=&queue;
Init_Queue(q);
visited[i]=1;
printf("%4d",g->adjlist[i].vertex);
Add_Queue(q,i);
while(!
Queue_Empty(q)){
v=Gethead_Queue(q);
Del_Queue(q);
p=g->adjlist[v].link;
while(p!
=NULL){
if(visited[p->adjvex]==0){
visited[p->adjvex]=1;
printf("%4d",g->adjlist[p->adjvex].vertex);
Add_Queue(q,p->adjvex);
}
p=p->next;
}
}
}
main(){
ADJGRAPH*g,adjg;
inti;
g=&adjg;
create_adjgraph(g);
printf("广度遍历的结果:
\n");
for(i=1;i<=g->vexnum;i++){
if(visited[i]!
=1)
bfs(g,i);
}
printf("\n");
}
头程序:
seqqueue.h
#definedatatypeint
#defineMAXSIZE100
typedefstruct{
datatypedata[MAXSIZE];/*队列的最大存储空间*/
intfront,rear;/*队头队尾指针*/
}SEQQUEUE;
SEQQUEUE*q;
voidInit_Queue(SEQQUEUE*q){/*初始化队列*/
q->front=0;
q->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->front)
printf("Queuefull\n");
else{
q->rear=(q->rear+1)%MAXSIZE;
q->data[q->rear]=x;