1、图 图1、实验目的 1. 掌握图的基本存储方法。 2. 掌握有关图的操作算法并用高级语言实现。 3. 熟练掌握图的两种搜索路径的遍历方法。 4. 掌握图的有关应用,2、实验要求 1. 认真阅读和掌握本实验的程序。 2. 上机运行本程序。 3. 保存很打印出程序的运行结果,并结合程序进行分析。 4. 按照对图的操作需要,重新改写主程序并运行,打印出文件清单和运行结果。3、实验内容 1. 建立无向图的邻接矩阵存储并输出。 2. 建立图的邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历。4、解题思路分析 1. 无向图的邻接矩阵是对称的,而无向图的邻接矩阵不一定对称。因此,用邻接矩阵来表示一个
2、具有n个顶点的有向图时,要用n2个单元存储邻接矩阵;对有n个顶点的无向图,则只需存入下三角矩阵,故只需使用n(n+1)/2个存储单元。 2. 邻接表表示法是图的一种链式分配的存储结构,包括链表和向量。在邻接表中的每个结点结点(表结点)由两个域组成:邻接的顶点域(vertex)和链域(next);每个链表的上边附设一个表头结点,在表头结点中,除了设有链域(first)用于指向链表中的第一个结点之外,还设有用于存储顶点Vi名4或其他有关信息的数据域(data)。5、程序清单 1. #include#include#define MAX 20typedef int VexType;typedef V
3、exType MgraphMAXMAX;/*函数原型声明*/void creat_mg(Mgraph G);void output_mg(Mgraph G);Mgraph G1;int n,e,v0;/*主函数*/void main()creat_mg(G1);output_mg(G1);/*建立无向图邻接矩阵*/void creat_mg(Mgraph G)int i,j,k;printf(n请输入无向图的顶点数和边数,如(6,5):);scanf(%d,%d,&n,&e);for(i=1;i=n;i+)for(j=1;j=n;j+) Gij=0;/*如果是网,Gij=0改为Gij=3276
4、7(无穷)*/for(k=1;k=e;k+) printf (n请输入每条边的两个顶点编号,如(2,5):);scanf(%d,%d,&i,&j);Gij=1;Gij=1;/*输出邻接矩阵*/void output_mg(Mgraph G)int i,j;for(i=1;i=n;i+)printf(n);for(j=1;j=n;j+) printf(%5d,Gij);printf(n); 2. #include#include#define MAX 20typedef int VexType;typedef struct Vnode VexType data; struct Vnode *ne
5、xt;Vnode;typedef Vnode LgraphMAX;typedef struct int vMAX; int front; int rear;Queue;void creat_L(Lgraph G);void output_L(Lgraph G);void dfsL(Lgraph G,int v);void bfsL(Lgraph G,int v);Lgraph Ga;int n,e,visitedMAX;void main() int v1,i; for(i=0;iMAX;i+)visitedi=0; creat_L(Ga); output_L(Ga); printf(n请输入
6、深度优先遍历的出发点:); scanf(%d,&v1); printf(n深度优先遍历的结果为:); dfsL(Ga,v1); for(i=0;iMAX;i+)visitedi=0; printf(n请输入广度优先遍历的出发点:); scanf(%d,&v1); printf(n广度优先遍历的结果为:); bfsL(Ga,v1);void creat_L(Lgraph G) Vnode *p,*q; int i,j,k; printf(n请输入图的顶点数和边数:); scanf(%d,%d,&n,&e); for(i=1;i=n;i+)Gi.data=i;Gi.next=NULL; for(k
7、=1;kdata=i; p-next=Gi.next;Gi.next=p; q=(Vnode *)malloc(sizeof(Vnode); q-data=j; q-next=Gi.next;Gi.next=q; void output_L(Lgraph G) int i; Vnode *p; for(i=1;idata);p=p-next; void initqueue(Queue *q) q-front=-1; q-rear=-1;int quempty(Queue *q) if(q-front=q-rear) return 1; else return 0;void enqueue(Qu
8、eue *q,int e) if(q-rear+1)%MAX=q-front) printf(队列满!n); else q-rear=(q-rear+1)%MAX; q-vq-rear=e; int dequeue(Queue *q) int t; if(q-front=q-rear) printf(队列空!n);return 0; else q-front=(q-front+1)%MAX; t=q-vq-front; return t; void dfsL(Lgraph G,int v) Vnode *p; printf(%d-,Gv.data); visitedv=1; p=Gv.next
9、; while(p)v=p-data; if(visitedv=0)dfsL(G,v); p=p-next; void vfsL(Lgraph g,int v) int x; Vnode *p; Queue *q=(Queue *)malloc(sizeof(Queue); initqueue(q); printf(n %d-,gv.data); visitedv=1; enqueue(q,v); while(!quempty(q) x=dequeue(q); p=gv.next; while(p) v=p-data; if(visitedv=0) printf(%d-,gv.data); visitedv=1; enqueue(q,v); p=p-next; printf(n);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1