图的存储结构——邻接表的建立

来源:互联网 发布:绘画软件 编辑:程序博客网 时间:2024/05/19 02:40

邻接表(无向图)

  1. 图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易地读取顶点信息,更加方便。
  2. 图中每个顶点Vi的所有邻接点构成一个线性表,由于邻接点的个数不确定,所以我们选择用单链表来存储。




邻接表(有向图)


把顶点当弧尾建立的邻接表
邻接表(有向图)
有向图的逆邻接表:
邻接表(有向图)

邻接表(网)

对于带权值的网图,可以在边表结点定义中再增加一个数据域来存储权值即可:
邻接表(网)

代码:
#include <stdio.h>#include <stdlib.h>#define MAXVEX 100//结点定义typedef char VertexType;typedef int EdgeType;//边表结点typedef struct EdgeNode {int adjvex;//邻接点域,存储该顶点对应的下标EdgeType weight;//用于存储权值,对于非网图可以不需要struct EdgeNode *next;//链域,指向下一个邻接点}EdgeNode;//顶点表结点typedef struct VertexNode{VertexType data; //顶点域,存储顶点信息EdgeNode *firstedge; //边表头指针}VertexNode,AdjList[MAXVEX];typedef struct{AdjList adjList;int numVertexes,numEdges;//图中当前顶点数和边数}GraphAdjList;//建立图的邻接表结构void CreateALGraph(GraphAdjList *G){int i,j,k;EdgeNode *e;//输入顶点和边数printf("输入顶点数和边数:\n");scanf("%d,%d",&G->numVertexes,&G->numEdges);getchar();//输入顶点信息,建立顶点表printf("输入顶点字符:\n");for(i=0;i<G->numVertexes;i++){scanf("%c",&G->adjList[i].data);G->adjList[i].firstedge=NULL;}//建立边表for(k=0;k<G->numEdges;k++){printf("输入边(vi,vj)上的顶点序号:\n");scanf("%d,%d",&i,&j);//(单链表中的头插法)e = (EdgeNode*)malloc(sizeof(EdgeNode));//向内存申请空间//生成边表结点e->adjvex=j;e->next=G->adjList[i].firstedge;G->adjList[i].firstedge=e;e = (EdgeNode*)malloc(sizeof(EdgeNode));//向内存申请空间//生成边表结点e->adjvex=i;e->next=G->adjList[i].firstedge;G->adjList[i].firstedge=e;}}int main(void){    GraphAdjList G;    CreateALGraph(&G);return 0;}


0 0