图.docx
《图.docx》由会员分享,可在线阅读,更多相关《图.docx(8页珍藏版)》请在冰豆网上搜索。
图
图
1、实验目的
1.掌握图的基本存储方法。
2.掌握有关图的操作算法并用高级语言实现。
3.熟练掌握图的两种搜索路径的遍历方法。
4.掌握图的有关应用,
2、实验要求
1.认真阅读和掌握本实验的程序。
2.上机运行本程序。
3.保存很打印出程序的运行结果,并结合程序进行分析。
4.按照对图的操作需要,重新改写主程序并运行,打印出文件清单和运行结果。
3、实验内容
1.建立无向图的邻接矩阵存储并输出。
2.建立图的邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历。
4、解题思路分析
1.无向图的邻接矩阵是对称的,而无向图的邻接矩阵不一定对称。
因此,用邻接矩阵来表示一个具有n个顶点的有向图时,要用n2个单元存储邻接矩阵;对有n个顶点的无向图,则只需存入下三角矩阵,故只需使用n(n+1)/2个存储单元。
2.邻接表表示法是图的一种链式分配的存储结构,包括链表和向量。
在邻接表中的每个结点结点(表结点)由两个域组成:
邻接的顶点域(vertex)和链域(next);每个链表的上边附设一个表头结点,在表头结点中,除了设有链域(first)用于指向链表中的第一个结点之外,还设有用于存储顶点Vi名4或其他有关信息的数据域(data)。
5、程序清单
1.#include
#include
#defineMAX20
typedefintVexType;
typedefVexTypeMgraph[MAX][MAX];
/*函数原型声明*/
voidcreat_mg(MgraphG);
voidoutput_mg(MgraphG);
MgraphG1;
intn,e,v0;
/*主函数*/
voidmain()
{creat_mg(G1);
output_mg(G1);
}
/*建立无向图邻接矩阵*/
voidcreat_mg(MgraphG)
{inti,j,k;
printf("\n请输入无向图的顶点数和边数,如(6,5):
");
scanf("%d,%d",&n,&e);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)G[i][j]=0;
/*如果是网,G[i][j]=0改为G[i][j]=32767(无穷)*/
for(k=1;k<=e;k++)
{printf("\n请输入每条边的两个顶点编号,如(2,5):
");
scanf("%d,%d",&i,&j);
G[i][j]=1;G[i][j]=1;
}
}
/*输出邻接矩阵*/
voidoutput_mg(MgraphG)
{inti,j;
for(i=1;i<=n;i++)
{printf("\n");
for(j=1;j<=n;j++)printf("%5d",G[i][j]);
}
printf("\n");
}
2.#include
#include
#defineMAX20
typedefintVexType;
typedefstructVnode
{
VexTypedata;
structVnode*next;
}Vnode;
typedefVnodeLgraph[MAX];
typedefstruct{
intv[MAX];
intfront;
intrear;
}Queue;
voidcreat_L(LgraphG);
voidoutput_L(LgraphG);
voiddfsL(LgraphG,intv);
voidbfsL(LgraphG,intv);
LgraphGa;
intn,e,visited[MAX];
voidmain()
{
intv1,i;
for(i=0;icreat_L(Ga);
output_L(Ga);
printf("\n请输入深度优先遍历的出发点:
");
scanf("%d",&v1);
printf("\n深度优先遍历的结果为:
");
dfsL(Ga,v1);
for(i=0;iprintf("\n请输入广度优先遍历的出发点:
");
scanf("%d",&v1);
printf("\n广度优先遍历的结果为:
");
bfsL(Ga,v1);
}
voidcreat_L(LgraphG)
{
Vnode*p,*q;
inti,j,k;
printf("\n请输入图的顶点数和边数:
");
scanf("%d,%d",&n,&e);
for(i=1;i<=n;i++){G[i].data=i;G[i].next=NULL;}
for(k=1;k<=e;k++)
{
printf("\n请输入每条边的关联顶点编号:
");
scanf("%d,%d",&i,&j);
p=(Vnode*)malloc(sizeof(Vnode));
p->data=i;
p->next=G[i].next;G[i].next=p;
q=(Vnode*)malloc(sizeof(Vnode));
q->data=j;
q->next=G[i].next;G[i].next=q;
}
}
voidoutput_L(LgraphG)
{
inti;
Vnode*p;
for(i=1;i<=n;i++)
{
printf("\n与[%d]关联的定点有:
",i);
p=G[i].next;
while(p!
=NULL){printf("%5d",p->data);p=p->next;}
}
}
voidinitqueue(Queue*q)
{
q->front=-1;
q->rear=-1;
}
intquempty(Queue*q)
{
if(q->front==q->rear)
{return1;}
else
{return0;}
}
voidenqueue(Queue*q,inte)
{
if((q->rear+1)%MAX==q->front)
printf("队列满!
\n");
else
{
q->rear=(q->rear+1)%MAX;
q->v[q->rear]=e;
}
}
intdequeue(Queue*q)
{
intt;
if(q->front==q->rear)
{printf("队列空!
\n");return0;}
else
{q->front=(q->front+1)%MAX;
t=q->v[q->front];
returnt;
}
}
voiddfsL(LgraphG,intv)
{
Vnode*p;
printf("%d->",G[v].data);
visited[v]=1;
p=G[v].next;
while(p){v=p->data;
if(visited[v]==0)dfsL(G,v);
p=p->next;
}
}
voidvfsL(Lgraphg,intv)
{
intx;
Vnode*p;
Queue*q=(Queue*)malloc(sizeof(Queue));
initqueue(q);
printf("\n%d->",g[v].data);
visited[v]=1;
enqueue(q,v);
while(!
quempty(q))
{
x=dequeue(q);
p=g[v].next;
while(p){
v=p->data;
if(visited[v]==0)
{
printf("%d->",g[v].data);
visited[v]=1;
enqueue(q,v);
}
p=p->next;
}
}
printf("\n");
}