计算机实验报告经典.docx

上传人:b****2 文档编号:2138836 上传时间:2022-10-27 格式:DOCX 页数:14 大小:148.27KB
下载 相关 举报
计算机实验报告经典.docx_第1页
第1页 / 共14页
计算机实验报告经典.docx_第2页
第2页 / 共14页
计算机实验报告经典.docx_第3页
第3页 / 共14页
计算机实验报告经典.docx_第4页
第4页 / 共14页
计算机实验报告经典.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

计算机实验报告经典.docx

《计算机实验报告经典.docx》由会员分享,可在线阅读,更多相关《计算机实验报告经典.docx(14页珍藏版)》请在冰豆网上搜索。

计算机实验报告经典.docx

计算机实验报告经典

中国矿业大学矿业工程学院

 

实验报告

课程名称计算机软件设计基础

姓名黄开文班级采矿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;

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

当前位置:首页 > 农林牧渔 > 农学

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

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