用邻接表实现无向图的创建与输出

 1 #include<stdio.h>
 2 #include <iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 #define MVNum 100
 6 typedef struct ArcNode // 边表结点
 7 {
 8     int adjvex;    // 邻接点域,存储该顶点对应的下标
 9     //int info;      //用于存储权值,对于非网图可以不需要
10     struct ArcNode *nextarc; // 链域,指向下一个邻接点
11 }ArcNode;
12 typedef struct VNode // 顶点表结点
13 {
14     char data; // 顶点域,存储顶点信息
15     ArcNode *firstarc; // 边表头指针
16 }VNode, AdjList[MVNum];
17 typedef struct
18 {
19     AdjList vertices;
20     int vexnum,arcnum; // 图中当前顶点数和边数
21 }ALGraph;
22 
23 int LocateVex(ALGraph &G,char v)//找到v在邻接表G中的位置
24 {
25     for(int i=0;i<G.vexnum;i++)
26     {
27         if(G.vertices[i].data==v)
28             return i;
29     }
30     return -1;
31 }
32 void  CreateALGraph(ALGraph &G)
33 {
34     int i,j,k,v;
35     char v1,v2;
36     ArcNode *p1,*p2;
37     scanf("%d%d",&G.vexnum,&G.arcnum); // 输入顶点数和边数
38     for(v = 0;v < G.vexnum;v++) // 读入顶点信息,建立顶点表
39     {
40         scanf("%s",&G.vertices[v].data);     // 输入顶点信息
41         G.vertices[v].firstarc=NULL;     // 将边表置为空表
42     }
43     getchar();
44     for(k = 0;k < G.arcnum;k++)// 建立边表
45     {
46         scanf("%c %c",&v1,&v2);
47         getchar();
48         i=LocateVex(G,v1);
49         j=LocateVex(G,v2);
50         p1=new ArcNode; // 向内存申请空间,生成边表结点
51         p1->adjvex=j;    // 邻接序号为j
52         p1->nextarc=G.vertices[i].firstarc;    //将e的指针指向当前顶点上指向的结点
53         G.vertices[i].firstarc=p1;            // 将当前顶点的指针指向e
54 
55         p2=new ArcNode; // 向内存申请空间,生成边表结点
56         p2->adjvex=i;    //邻接序号为i
57         p2->nextarc=G.vertices[j].firstarc;    // 将e的指针指向当前顶点上指向的结点
58         G.vertices[j].firstarc=p2;        // 将当前顶点的指针指向e
59     }
60 }
61 void DispGraphAdjList(ALGraph &G)
62 {
63     int i;
64     ArcNode *p;
65     for(i=0;i< G.vexnum;i++)
66     {
67         printf("%c",G.vertices[i].data);
68         for(p=G.vertices[i].firstarc;p!=NULL;p=p->nextarc)
69             printf("->%c",p->adjvex+'A');
70         printf("\n");
71     }
72 }
73 int main(void)
74 {
75     ALGraph G;
76     CreateALGraph(G);
77     DispGraphAdjList(G);
78     return 0;
79 }

如上图所示的无向图(邻接表创建):

输入:

8 9
A B C D E F G H
A B
B D
B E
E F
D F
A C
C G
C H
G H

输出:

A->C->B
B->E->D->A
C->H->G->A
D->F->B
E->F->B
F->D->E
G->H->C
H->G->C

猜你喜欢

转载自www.cnblogs.com/diandianer/p/9965805.html