• 【系列文章】数据结构与算法——图


    ---恢复内容开始---

    接触C语言是很早以前的事了,大概是在初中二年级。后来发现只学语言,不学算法根本没用,于是乎萌发了学习数据结构和算法的想法,但一直没有什么实际进展。直到今天,才决定好好研究一番(ps:今年大一,甚是惭愧),顺便把学习过程记录在这一系列文章之中。好了,废话不多说,开始我这一系列的文章。文中可能有错误,如果你发现了,我恳请你帮我指出。谢谢。

    图——图能很方便的描述一些实际问题,常用于寻找最优解类型的问题。其他相关概念,百度百科说的很清楚了。

    学习图大概有以下几个过程。

    一.创建图:(邻接表和领接矩阵)

    二.遍历图:(深度遍历和广度遍历)

    三.使用图:(普里姆算法,迪杰斯特拉算法等)

    详解:

    一:创建图:

      常见的图的表示方法有两种,一是邻接矩阵方法,而是邻接表方法,各有优势。邻接矩阵法适合于节点较少的,稠密的图,而邻接表法则适合于相反情况。

      但我个人在使用中更加偏向于使用邻接表法(可能是我更排斥C语言中静态数组的原因吧,所以我所有实例都会是邻接表法)

      好,确定了采用哪种方法表示图后,还要确定具体的一些表示发放。例如图中节点的表示方法

      具体思维过程如下:(以邻接表发为例)

      首先创建一个结构体类型用来表示图

    typedef struct _gragh
    {
        Vertex * vertexs;
        int vertexCount;
    }Gragh;

      其中的Vertex代表顶点类型

    typedef struct _vertex
    {
        ElemType data;
        Node *firstNode;
    }Vertex;

      根据邻接表的定义方法,每一个顶点都有一个维护一个链表,用来存储他的邻接点

      所以链表中节点类型为Node

    typedef struct _node
    {
        ElemType data;
        int weight;
        struct _node *next;
    }Node;

      每个节点包含节点数据data,该节点对应边的权值,以及下一个邻接点的指针。

      好了,基本的类型定义完了,我们就实际的创建一个图。创建图我用函数CreateGragh

    void CreateGragh(Gragh **gragh)
    {
        int i, j,k;
        int count;
        printf("输入顶点个数:
    ");
        scanf("%d", &count);
        *gragh = (Gragh *)malloc(sizeof(Gragh));
        (*gragh)->vertexCount = count;
        (*gragh)->vertexs = (Vertex*)malloc(sizeof(Vertex)*count);
        if (*gragh == NULL)
            ErrorMsg();
        for (i = 0; i < count; i++)
        {
            Vertex *newVertex = (Vertex*)malloc(sizeof(Vertex));
            newVertex->firstNode = NULL;
            printf("输入此顶点数据和邻接点个数:
    ");
            scanf("%d%d", &newVertex->data, &newVertex->count);
            for (j = 0; j < newVertex->count; j++)
            {
                Node *newNode = (Node*)malloc(sizeof(Node));
                printf("输入邻接点数据和该邻接点对应边权值:
    ");
                scanf("%d%d", &newNode->data, &newNode->weight);
                newNode->next = NULL;
                
                Node *temp = newVertex->firstNode;
                if (temp == NULL)
                    newVertex->firstNode = newNode;
                else
                {
                    while (temp->next != NULL)
                    {
                        temp = temp->next;
                    }
                    temp->next = newNode;
                }
            }
            (*gragh)->vertexs[i] = *newVertex;
        }
    }

    在创建图的时候,我们只需要传入一个Gragh类型的指针变量即可。

    调用如下:(在主函数中如下调用即可)

    Gragh *gragh;
    CreateGragh(&gragh);

    具体调用实例不再给出。。嘿嘿。

    本文章为系列文章,下一篇:遍历图

  • 相关阅读:
    python之路day08--文件的操作
    python之路day07-集合set的增删查、列表如何排重(效率最高的方法)、深浅copy
    python之路day06-python2/3小区别,小数据池的概念,编码的进阶str转为bytes类型,编码和解码
    python之路day05--字典的增删改查,嵌套
    python之路day04--列表的增删改查,嵌套、元组的嵌套、range、for循环嵌套
    python之路day03--数据类型分析,转换,索引切片,str常用操作方法
    python之路day02--格式化输出、初始编码、运算符
    python之路day01--变量
    线程、进程、协程 异步io
    Ubuntu学习(转载)
  • 原文地址:https://www.cnblogs.com/cjw1115/p/4639233.html
Copyright © 2020-2023  润新知