采用邻接表创建
完整代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXVEX 20 //邻接表表示 typedef char VertexType; //边表 typedef struct EdgeNode { int adjvex;//连接上节点的下标 struct EdgeNode* next; }EdgeNode; //顶点表 typedef struct VertexNode { VertexType data; EdgeNode* firstedge;//边表的头指针 }VertexNode,AdjList[MAXVEX]; typedef struct { AdjList adjlist;//邻接表 int numVertexs,numEdges;//顶点数,边数 }GraphAdjList; //创建 void Create(GraphAdjList* G) { int i,j,k; EdgeNode* p; printf("输入顶点数和边数 "); scanf("%d%d",&G->numVertexs,&G->numEdges); //顶点 printf("输入顶点信息: "); for(i=0;i<G->numVertexs;i++) { getchar(); scanf("%c",&G->adjlist[i].data); G->adjlist[i].firstedge=NULL; } //边(边的两头为顶点下标) printf("输入边(Vi,Vj)中的下标i,j: "); for(k=0;k<G->numEdges;k++) { scanf("%d%d",&i,&j); p=(EdgeNode*)malloc(sizeof(EdgeNode));//包括当前连接上的节点,以及下一个节点 //连接上的节点 p->adjvex=j; //采取头插法 /* 先把顶点i的第一个连接的位置和p上,然后顶点i再与p连接 */ p->next=G->adjlist[i].firstedge; G->adjlist[i].firstedge=p;//表邻接表给相应的节点 //下面代码,无向图中有;如果是有向图就没有 p=(EdgeNode*)malloc(sizeof(EdgeNode)); p->adjvex=i; p->next=G->adjlist[j].firstedge; G->adjlist[j].firstedge=p; } //打印邻接表 printf("邻接表为: "); for(i=0;i<G->numVertexs;i++) { p=G->adjlist[i].firstedge; while(p) { printf("(%c,%c)",G->adjlist[i].data,G->adjlist[p->adjvex].data); p=p->next; } printf(" "); } } int main() { GraphAdjList G; Create(&G); }
结果: