图的十字链表表示法(有向图)-数据结构(19)

来源:互联网 发布:苏客会孵化器知乎 编辑:程序博客网 时间:2024/04/29 11:53

一、为什么会出现十字链表

在上一节中可以看到图的数值存储方法,可以看到这种存储方法很浪费空间,一旦数组大了,要遍历图都需要整个遍历。因此遍出现了邻接表,邻接表是加多一个指针为了保存后继。而十字链表即保存了入链和出链。

二、存储结构

//==========有向图的十字链表===============typedef int InfoType;typedef struct ArcBox{int tailvex, headvex;//数组索引的弧头和弧尾struct ArcBox *hlink, *tlink;//头链和尾链 头链是弧头相同的下一条弧 尾弧是弧尾相同的一条弧InfoType info;}ArcBox;//弧typedef struct VexNode{VertexType data;ArcBox *firstin, *firstout;}VexNode;//头结点typedef struct{VexNode xlist[MAX_VERTEX_NUM];int vexnum, arcnum;//顶点总数 和弧总数}OLGraph;

三、操作

Status CreateDG(OLGraph &G, int vexnum, char * vexs, int arcnum, int maps[][6]){//创建有向图G.vexnum = vexnum;G.arcnum = arcnum;for (int i = 0; i < G.vexnum; i++){//初始化指针G.xlist[i].data = vexs[i];G.xlist[i].firstin = NULL;G.xlist[i].firstout = NULL;}for (int i = 0; i < vexnum; i++){for (int j = 0; j < vexnum; j++){if (maps[i][j] != 0){//i到j这个有有弧ArcBox * p = (ArcBox*)malloc(sizeof(ArcBox));*p = { i, j, G.xlist[j].firstin, G.xlist[i].firstout, maps[i][j] };G.xlist[i].firstout = p;G.xlist[j].firstin = p;}}}return OK;}//对弧的所有遍历.void PrintfGraphDg(OLGraph G){printf("弧尾\t弧头\n");for (int i = 0; i < G.vexnum; i++){ArcBox* arc = G.xlist[i].firstout;while (arc!=NULL){printf("%d\t%d \t%c->%c 权重:%d\n", arc->tailvex, arc->headvex, G.xlist[arc->tailvex].data, G.xlist[arc->headvex].data,arc->info);arc = arc->tlink;}}}

四、执行

//用十字链表创建一个有向图P165int vexnum = 4;char *vexs = "abcd";int arcnum = 7;int maps[4][4] = {{ 0, 1, 1, 0 },{ 0, 0, 0, 0 },{ 1, 0, 0, 1 },{ 1, 1, 1, 0 },};OLGraph G;CreateDG(G,vexnum,vexs,arcnum,maps);PrintfGraphDg(G);

输出:
弧尾    弧头0       2       a->c 权重:10       1       a->b 权重:12       3       c->d 权重:12       0       c->a 权重:13       2       d->c 权重:13       1       d->b 权重:13       0       d->a 权重:1请按任意键继续. . .