图(一)之邻接表Adjacency List
来源:互联网 发布:睿智大数据 编辑:程序博客网 时间:2024/05/01 00:28
开始攻克图的算法,先从最简单的存储开始实现,本文关于邻接表的实现。
邻接表是图的存储中最简单也是最基本的存储结构,基于链表的思想实现的。在邻接表中,对于中的每个顶点建立一个单链表,第i个单链表中的节点表示依附于顶点的vi的边。每个节点由3个域组成其中邻接点域(adjvex)指示与顶点vi邻接的点在图中的位置,链域(nextarc)指示下一条边或弧的节点;数据域(info)存储和边或弧相关的信息,如权值等,每个链表上附设一个表头节点。在表头节点中除了设有链域(firstarc)指向链表中的第一个节点之外,还设有存储顶点vi的名或其他有关信息的数据域(data)。
两种表结构如图:
我以下面的图结构为例进行操作:
下面把代码贡献出来:
Adj_List.h
#ifndef __ADJ_LIST_H__#define __ADJ_LIST_H__#define MAX_VERTEX_NUM 20typedef struct ArcNode{char adjvex;struct ArcNode *nextarc;int *info;}ArcNode;typedef struct VNode{char data;ArcNode *firstarc;}VNode,AdjList[MAX_VERTEX_NUM];typedef struct ALGraph{AdjList vertices;int vexnum,arcnum;int kind;}ALGraph;#endif /* __ADJ_LIST_H__*/
graph_storage.c
/* ************************************************ *Name : graph_storage.c * *Date : 2015-05-27 * *Author : sniper * *Aim : It will storage the graph using the adj-* * acency list,and travel the pragh. * ************************************************ */#include <stdio.h>#include <stdlib.h>#include "Adj_list.h"int create(ALGraph *G){int i,j;int node_pair1,node_pair2;ArcNode *arc;node_pair1=0;node_pair2=0;i=0;j=0;printf("please input the number of node and edge: ");scanf("%d %d",&G->vexnum,&G->arcnum);for(i=0;i<G->vexnum;i++){G->vertices[i].data = 'A'+i;G->vertices[i].firstarc = NULL;}printf("finish the Node!\n");for(j=0;j<G->arcnum;j++){printf("please input the node pair: ");scanf("%d %d",&node_pair1,&node_pair2);node_pair1-=1;node_pair2-=1;/* *Node pair get match with each other *and storage into the adjacency list. */arc = (ArcNode *)malloc(sizeof(ArcNode));arc->adjvex = node_pair2+'A';arc->nextarc=G->vertices[node_pair1].firstarc;G->vertices[node_pair1].firstarc=arc;arc = (ArcNode *)malloc(sizeof(ArcNode));arc->adjvex = node_pair1+'A';arc->nextarc=G->vertices[node_pair2].firstarc;G->vertices[node_pair2].firstarc=arc;}printf("finish the Adjacency List\n");return 0;}int main(){ALGraph *G;int i;i=0;G = (ALGraph *)malloc(sizeof(ALGraph));create(G);/* *print the adjacency list */for(i=0;i<G->vexnum;i++){printf("%c -> ",'A'+i);while(G->vertices[i].firstarc!=NULL){printf("%c -> ",G->vertices[i].firstarc->adjvex);G->vertices[i].firstarc=G->vertices[i].firstarc->nextarc;}printf("\n");}return 0;}也可以从我的GitHub clone
https://github.com/cremyos/Graph_Adj_List
测试用例:
5 61 21 42 32 53 43 5好了下次该解决下面的问题了!
0 0
- 图(一)之邻接表Adjacency List
- 邻接多重表(Adjacency Multilist)
- 图(有向图)的邻接表表示 C++实现(遍历,拓扑排序,最短路径,最小生成树) Implement of digraph and undigraph using adjacency list
- OSPF(一):Neighbor&Adjacency
- Adjacency List Dijkstra
- 图之邻接表
- 图之邻接表
- 图之邻接表
- 06-图1. List Components (25) (邻接表实现)
- 建图方式一 之 “邻接链表”
- 邻接表无向图(一)之 C语言详解
- 邻接表有向图(一)之 C语言详解
- Graph Theory Adjacency List.解释
- 邻接矩阵(Adjacency Matrix)
- 邻接矩阵(Adjacency Matrix)
- 图之邻接多重表
- 图的实现(一)-邻接矩阵和邻接表
- 图(邻接表)
- 南宁长肛周脓肿吃什么好
- http协议
- 南宁治疗肛周脓肿的偏方
- 去掉字符串<>
- 南宁做肛周脓肿手术视频
- 图(一)之邻接表Adjacency List
- LeetCode 21:Merge Two Sorted Lists
- 南宁肛周脓肿的最好药物
- mysql explain
- Hadoop之——命令行运行时指定参数
- 南宁肛周脓肿不手术行吗
- OD常用快捷键
- 83Remove Duplicates from Sorted List
- 南宁肛周脓肿能自己好吗