标签:
---恢复内容开始---
接触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);
具体调用实例不再给出。。嘿嘿。
本文章为系列文章,下一篇:遍历图
标签:
原文地址:http://www.cnblogs.com/cjw1115/p/4639233.html