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

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

接触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("输入顶点个数:\n");
    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("输入此顶点数据和邻接点个数:\n");
        scanf("%d%d", &newVertex->data, &newVertex->count);
        for (j = 0; j < newVertex->count; j++)
        {
            Node *newNode = (Node*)malloc(sizeof(Node));
            printf("输入邻接点数据和该邻接点对应边权值:\n");
            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);

 

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

 

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

posted @ 2015-07-11 19:35  DemoApp  阅读(361)  评论(0编辑  收藏  举报