图的存储结构——邻接表的建立
2014-07-06 15:05
405 查看
邻接表(无向图)
图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易地读取顶点信息,更加方便。图中每个顶点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; }
相关文章推荐
- 5.2.3 建立图的存储结构 :邻接表 和 邻接矩阵
- 建立图的存储结构 :邻接表 和 邻接矩阵
- 数据结构:图的存储结构之邻接表
- 【数据结构】图的存储方式:邻接矩阵和邻接表
- 图的存储结构——邻接表 以SDUT 2138为例
- 图的存储结构之邻接表(详解)
- 图的邻接表存储结构
- 图的邻接表存储结构
- 16 - 12 - 26 图的存储结构-邻接矩阵、邻接表、十字链表
- 数据结构上机实验--有向图邻接表的建立,深度广度搜索及拓扑排序
- 线性表的存储结构优缺点及编程实现一个单链表的建立,测长,打印
- 算法与数据结构基础8:C++实现有向图——邻接表存储
- 数据结构——图的存储 邻接表
- 【数据结构】图的存储方式:邻接矩阵和邻接表
- 数据结构之图的存储表示(邻接矩阵、邻接表和边集数组)
- 图的存储结构(邻接矩阵、边数组、邻接表、十字链表、邻接多重表)
- 分别采用深度和广度遍历数据库中邻接表中存储的树形结构的数据
- 图的存储结构(邻接表)
- 数据结构(10) -- 图的邻接表存储
- 图的邻接表存储结构