1、int adjvex;struct node *nextEdgeNode;vextype vex;EdgeNode * firstedge;VexNode;VexNode adjvexMAXSIZE;int n,e;ALGraph;四、 概要设计为了实现上述程序功能,代码如下:#includestdlib.hstring.htypedef struct node/边表结点 int adj;/边表结点数据域 struct node *next;node;typedef struct vnode/顶点表结点 char name20; node *fnext;vnode,AList20; AList
2、 List;/邻接表 int v,e;/顶点树和边数*Graph;/建立无向邻接表Graph CreatDG() Graph G; int i,j,k; node *s; G=malloc(20*sizeof(vnode); printf(请输入图的顶点数和边数(空格隔开):); scanf(%d%d,&G-v,&e);/读入顶点数和边数 for(i=0;iListi.name);/读入顶点信息 G-Listi.fnext=NULL;/边表置为空表 for(k=0;kadj=j;next=G-Listi.fnext;Listi.fnext=s;/将新结点*s插入顶点Vi的边表头部adj=i;/
3、邻接点序号为iListj.fnext;Listj.fnext=s;/ 将新结点*s插入顶点Vj的边表头部 return G;/有向邻接图Graph CreatAG() node *q;请输入图的顶点数和边数【空格隔开】: for (i=0; /读入顶点信息 for (k=0;请请输入第%d边的两顶点序号【空格隔开】: q=(node *)malloc(sizeof(node); /生成新边表结点s q- /邻接点序号为jListi.fnext=q;/输出图的邻接表void Print(Graph G) int i; node *p;t=邻接表=n p=G-%d | %3s,i,G- while
4、(p)-%3sListp-adj.name);%d,p-adj); p=p-next;ntypedef struct char vex20;Lists20; Lists l; int edge2020;/邻接矩阵 int v1,e1;/顶点数和弧数AGraph;int data; /* 某顶点与已构造好的部分生成树的顶点之间权值最小的顶点 */int lowcost; /* 某顶点与已构造好的部分生成树的顶点之间的最小权值 */ClosEdge20; /* 用普里姆算法求最小生成树时的辅助数组 */void CreateAN(AGraph *G1) /* 构造邻接矩阵结构的图G */ int
5、i,j,k,w;G1-v1,&e1); for(i=1;=G1-v1;请输入图%d号元素:,i);li.vex);i+)/初始化邻接矩阵 for(j=1;jedgeij = 9; for(k=1;e1;请输入两顶点及边的权值(空格隔开):%d%d%dj,&w);edgeij=w;edgeji=w;void PrintAN(AGraph *G1) int i,j;t=邻接矩阵=n%3d,G1-edgeij);/输出各顶点的度数void Du(Graph G)n顶点%2s的度为: j=0; j+; p=p-%dn,j);/栈typedef struct stack int x; struct st
6、ack *next;stack;int push(stack *s,int i) stack *p; p=(stack *)malloc(sizeof(stack); p-x=i;next=s- s-next=p; return 1;int pop(stack *s,int j) stack *p=s-/保存栈顶指针 j=p-x;next=p- /将栈顶元素摘下 free(p);/释放栈顶空间 return j;/拓扑排序void Topo(Graph G,stack *s) int i,k, count; int j=0; int indegree20=0; p=G-; while(p!=N
7、ULL) indegreep-adj+; p=p-i+) if(indegreei=0) push(s,i); count=0; while(s-next! i=pop(s,j);%2s +count; for(p=G-p!=NULL;p=p-next) k=p-adj; if(!(-indegreek) push(s,k); if(countadj) DFS(G,p-adj,flag);/深度优先遍历void DFSTravel(Graph G) int flag20;/标志数组 flagi=0;flagi) DFS(G,i,flag);/建立队列 int *elem; int front,
8、 rear;*Queue;/队列初始化void InitQueue(Queue Q) Q-elem=(int *)malloc(20*sizeof(int);Q-elem) exit(0);front=Q-rear=0;/入队void Enter(Queue Q, int e) if(Q-rear + 1)%20!= Q-front) Q-elemQ-rear =e; else队列满!rear=(Q-rear+1)%20;/出队void Leave(Queue Q, int e) if(Q-rear ! e=Q-front;队列空!front=(Q-front+1)%20;/广度优先遍历voi
9、d BFSTravel(Graph G) Queue Q; int i,j=0; Q=malloc(sizeof(20); InitQueue(Q); if(flagi=0) flagi=1; printf(%2s Enter(Q,i); while(Q-front!=Q-rear) Leave(Q,j);/队头元素出队并置为j p=G- while(p! if(flagp-adj=0) printf( flagp-adj=1; Enter(Q,p- p=p- int minimum(ClosEdge cl,int vnum) int w,p; w=1000;=vnum; if(cli.low
10、cost!=0&cli.lowcostedgeuj; closedgeu.lowcost=0; /* 初始,U=u */ k=minimum(closedge,G1-v1); /* 求出生成树的下一个顶点 */%d-%dn,closedgek.data,k); /* 输出生成树的边 */ closedgek.lowcost=0; /* 第k顶点并入U集 */j+) /* 新顶点并入U后,修改辅助数组*/ if(G1-edgekjedgekj; /菜单列表void menu()t*图的遍历问题*ntt- 1.建立无向邻接图 -ntt- 2.建立有向邻接图 -ntt- 3.建立无向邻接矩阵 -nt
11、t- 4.输出各顶点的度 -ntt- 5.拓扑排序 -ntt- 6.深度优先遍历 -ntt- 7.广度优先遍历 -ntt- 8.prim算法生成最小生成树-ntt- 9-退出 -nt*n/主函数void main() AGraph G1; int choice,u; stack *s=(stack *)malloc(sizeof(stack);next =NULL; while(1) menu();请输入选择:choice); switch(choice) case 1:G=CreatDG();Print(G);printf(nnbreak; case 2:G=CreatAG(); case
12、3:CreateAN(&G1);PrintAN(& case 4:Du(G); case 5:拓扑排序:Topo(G,s); case 6:深度优先遍历:DFSTravel(G); case 7:广度优先遍历:BFSTravel(G); case 8: printf(请输入起点序号: scanf(u);Prim算法: Prim(&G1,u); break; case 9: exit(0); default:输入错误,请重新输入:nn 五、 使用说明1、程序名为实验图的遍历.exe,运行坏境为VC6.0.程序执行后显示如图所示:2、建立无向邻接图3、输出各顶点的度4、进行深度优先遍历5、进行广度
13、优先遍历6、建立有向邻接图7、拓扑排序8、建立无向邻接矩阵9、prim算法生成最小生成树八、实验总结通过对本次试验的学习,使我们明白了合作分工的重要性,这并不是一个容易的过程,中间碰到了许多问题,但我们都一一解决,有关于图这部分的内容很复杂,但是却非常重要,掌握好图的遍历有助于我们提升今后解决实际问题的能力,对我们非常有帮助。注:模块分工张纪远(2014100518)主函数的编写及页面的设计;段慧娟(2014100512)建立无向连接图及有向连接图;梁丽蓉(2014100526)建立无向邻接矩阵及及输出各顶点的度;周振军(2014100551)拓扑排序及深度优先遍历;朱新祥(2014100552) 广度优先遍历及prim算法生成最小生成树。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1