图的存储方式--邻接表法
来源:互联网 发布:windows ime下载 编辑:程序博客网 时间:2024/05/16 05:04
邻接表
邻接表法是图的链式存储方式,它包括表头节点表和边表;表头节点表存储图的各个顶点,每个节点由两部分组成:数据域(存储顶点的名称和其他数据)和链域(指向第一个邻接点);
C语言表述形式:
#define MAX_VERTEX_NUM 20//最多顶点个数typedef enum{DG,DN,UDG,UDN} GraphKing;//图的种类/*边表中节点的数据结构*/typedef struct ArcNode{int adjvex;//该弧指向顶点的位置struct ArcNode * nextarc;//指向下一条弧的指针/*可添加其他信息*/}ArcNode;/*表头节点表中节点的数据结构*/typedef struct VertexNode{VertexData data;//顶点数据ArcNode *firstarc;//指向该顶点的第一条弧的指针}VertexNode;typedef struct {VertexNode vertex[MAX_VERTEX_NUM];int vexnum,arcnum;//图的顶点数目和弧数目GraphKing king;//图的种类}AdjList;
下面给出测试代码:
/*建立无向图为例*/#include<stdio.h>#include<stdlib.h>#define MAX_VERTEX_NUM 20//最多顶点个数typedef int VertexData;typedef enum{DG,DN,UDG,UDN} GraphKing;//图的种类/*边表中节点的数据结构*/typedef struct ArcNode{int adjvex;//该弧指向顶点的位置struct ArcNode * nextarc;//指向下一条弧的指针/*可添加其他信息*/}ArcNode;/*表头节点表中节点的数据结构*/typedef struct VertexNode{VertexData data;//顶点数据ArcNode *firstarc;//指向该顶点的第一条弧的指针}VertexNode;typedef struct {VertexNode vertex[MAX_VERTEX_NUM];int vexnum,arcnum;//图的顶点数目和弧数目GraphKing king;//图的种类}AdjList;/*寻找数据v在表头节点表的位置*/int Locate(AdjList *G,VertexData v){int j=-1,k;for(j=1;j<=G->vexnum;j++){if(G->vertex[j].data == v){k = j;break;}}return j;}void CreateAdjList(AdjList *G){int i,k;int ch1,ch2;ArcNode *s,*p;printf("输入顶点个数及弧的条数:\n");scanf("%d%d",&G->vexnum,&G->arcnum);printf("输入各个顶点\n");for(i=1;i<=G->vexnum;i++){scanf("%d",&G->vertex[i].data);}for(i=1;i<=G->vexnum;i++){//从数组的第二位开始G->vertex[i].firstarc = NULL;}printf("输入弧的两个顶点\n");for(i=1;i<=G->arcnum;i++){printf("输入%d条弧数据:\n",i);scanf("%d%d",&ch1,&ch2);s = (ArcNode*)malloc(sizeof(ArcNode));//建立于顶点ch1相关的弧k = Locate(G,ch1);//printf("k = %d\n",k);s->adjvex = ch2;s->nextarc = G->vertex[k].firstarc;G->vertex[k].firstarc = s;//建立与顶点ch2相关的弧p = (ArcNode*)malloc(sizeof(ArcNode));k = Locate(G,ch2);//printf("k = %d\n",k);p->adjvex = ch1;p->nextarc = G->vertex[k].firstarc;G->vertex[k].firstarc = p;}}/*打印*/void PrintAdjList(AdjList *G){int i;ArcNode *p;for(i=1;i<=G->vexnum;i++){p = G->vertex[i].firstarc;printf("于顶点%d相关的弧: ",G->vertex[i].data);while(p != NULL){printf("%d ",p->adjvex);p = p->nextarc;}printf("\n");}}int main(){AdjList G;CreateAdjList(&G);PrintAdjList(&G);return 0;}
和邻接表对应的有逆邻接表,其主要区别为各个边或弧的adjvex存储的是指向该顶点的位置(对于有向图)
0 0
- 图的存储方式--邻接表法
- 邻接表的存储方式
- 2011.6.18 图的邻接表存储方式
- 数据结构(14):图的存储方式(邻接矩阵、邻接表....)
- 图的存储方式:邻接矩阵和邻接表【基础】
- 邻接表的几种存储方式
- 图的邻接表存储
- 图的邻接表存储
- 图的邻接表存储
- 图的存储-邻接表
- 图的邻接表存储
- 图的邻接表存储
- 图的邻接表存储
- 图的邻接表存储
- 图的邻接表存储
- 图的邻接表存储
- 图的邻接表存储
- 邻接表存储图
- java web中配置Filter解决jsp中文乱码问题
- 【DFS|暴力】USACO-cha1-sec1.3 Wormholes
- Android Studio 快捷键分享
- 报数游戏
- hdu - 2489 - Minimal Ratio Tree(枚举 + MST)
- 图的存储方式--邻接表法
- 5 分钟上手 Tmux
- UVA - 10130 SuperSale (01背包)
- 细说linux IPC(五):system V共享内存
- 运算符重载(OperatorOverloads)C#语言
- [LeetCode]Symmetric Tree
- 第13周项目1-数组大折腾-(4)
- C语言求Sn=1!+2!+3!+4!+5!+…+n!之和
- 使用Azure上的Azure AD服务管理Office 365账户(无缝打通Azure和Office 365)