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
原文地址:https://www.cnblogs.com/diandianer/p/9965805.html
时间: 2024-10-07 16:10:38