图的存储结构之十字链表

参考:《大话数据结构》

邻接表的缺陷:不能同时关注出度和入度

十字链表:

(1)顶点表

firstin表示入边表头指针,指向该顶点的入边表中的第一个结点;firstout表示出边表头指针,指向该顶点的出边表中的第一个结点。

(2)边表结点

tailvex是弧起点在顶点表中的下标;headvex是弧终点在顶点表中的下标;headlink是指入边表指针域,指向终点相同的下一条边;taillink是指出边表指针域,指向起点相同的下一条边。如果是网还可以增加一个weight域来存储权值。

.h文件

#pragma once

#define MAXVEX 20

typedef char VertexType; //顶点类型应由用户定义
typedef int EdgeType;     //边上的权值类型应由用户定义

typedef struct EdgeNode  //边表结点
{
    int tailvex;        
    int headvex;
    EdgeType weight;    
    struct EdgeNode *headlink; 
    struct EdgeNode *taillink;
}EdgeNode;

typedef struct VertexNode //顶点表结点
{
    VertexType data; 
    EdgeNode *firstin;  //入边表头指针
    EdgeNode *firstout; //出边表头指针
}VertextNode, CrossList[MAXVEX];

typedef struct
{
    CrossList adjList;
    int numVertexes, numEdges; //图中当前顶点数和边数
}GraphCrossList;


void CreateALGraph(GraphCrossList *G);

.cpp文件

#include "stdafx.h"
#include "adjLinkGraph.h"
#include <cstdlib>

void CreateALGraph(GraphCrossList *G)
{
    int i, j, k;
    EdgeNode *e;
    printf("输入顶点数和边数:\n");
    scanf_s("%d,%d", &G->numVertexes, &G->numEdges);

    for (i = 0; i < G->numVertexes; i++)
    {
        printf("输入顶点数据:\n");
        scanf_s("%d", &G->adjList[i].data);
        G->adjList[i].firstin = NULL;
        G->adjList[i].firstout = NULL;
    }

    for (k = 0; k < G->numEdges; k++)
    {
        printf("输入边<vi,vj>上的顶点序号:\n");
        scanf_s("%d,%d", &i, &j);
        /*
         * firstin  入边表头指针,当前顶点作为弧起点
         * firstout 出边表头指针,当前顶点作为弧终点
         *
         * tailvex 弧起点
         * headvex 弧终点
         *
         * taillink 入边表头指针,当前结点作为弧起点
         * headlink 出边表头指针,当前结点作为弧终点
         */
        e = (EdgeNode *)malloc(sizeof(EdgeNode));
        e->tailvex = i;
        e->headvex = j;
        e->taillink = G->adjList[i].firstout;
        e->headlink = G->adjList[j].firstin;

        G->adjList[i].firstout = e; 
        G->adjList[j].firstin = e;
    }
}

创建并显示结果

// AdjecentTable.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "adjLinkGraph.h"

void Display(GraphCrossList G)
{
    int i;
    EdgeNode *e;
    printf("共%d个顶点,%d条弧\n",G.numVertexes,G.numEdges);
    for(i=0;i<G.numVertexes;i++)
    {
        printf("顶点%d入度:",G.adjList[i].data);
        e = G.adjList[i].firstin;
        while (e)
        {
            printf("%d ",G.adjList[e->tailvex].data);
            e = e->headlink;
        }
        printf("出度");
        e = G.adjList[i].firstout;
        while (e)
        {
            printf("%d ",G.adjList[e->headvex].data);
            e = e->taillink;
        }
        printf("\n");
    }
}

int main()
{
    GraphCrossList G;
    CreateALGraph(&G);
    printf("邻接表创建成功!");
    Display(G);
    getchar();         
    return 0;
}

 

结果:

 

posted @ 2018-05-03 18:52  梦醒江南·Infinite  阅读(1459)  评论(0编辑  收藏  举报