您的位置:首页 > 理论基础 > 数据结构算法

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

2015-07-11 19:35 477 查看
---恢复内容开始---

接触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);


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

本文章为系列文章,下一篇:遍历图
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: