您的位置:首页 > 编程语言 > C语言/C++

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 邻接表