zoukankan      html  css  js  c++  java
  • 图的存储结构之十字链表

    参考:《大话数据结构》

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

    十字链表:

    (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("输入顶点数和边数:
    ");
        scanf_s("%d,%d", &G->numVertexes, &G->numEdges);
    
        for (i = 0; i < G->numVertexes; i++)
        {
            printf("输入顶点数据:
    ");
            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>上的顶点序号:
    ");
            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条弧
    ",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("
    ");
        }
    }
    
    int main()
    {
        GraphCrossList G;
        CreateALGraph(&G);
        printf("邻接表创建成功!");
        Display(G);
        getchar();         
        return 0;
    }

    结果:

  • 相关阅读:
    图片延时加载LazyLoad真的是LazyLoad吗?
    IO流操作实现文件拷贝\简单加密及相关知识点
    浅谈WebService开发(一)
    一次网站被挂恶意代码的查错经历
    自测,我的优点与缺点
    共鸣,此话在中国的确有些道理
    VsAddIn "Region this"
    虹影图片下载器(Preview)
    Group != Team
    同感,不转不行 低调做人,高调做事
  • 原文地址:https://www.cnblogs.com/144823836yj/p/8986967.html
Copyright © 2011-2022 走看看