数据--第40课 - 图的定义

Posted free-锻炼身体

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据--第40课 - 图的定义相关的知识,希望对你有一定的参考价值。

第40课 - 图的定义

1. 定义

图是由定点集合(Vertex)以及顶点间的关系集合组成的一种数据结构:Graph = (V, E)

V = { x|x属于某个数据对象}是顶点的有穷费控集合;E = {(x,y)|x,y属于V }是顶点之间关系的有穷集合,也叫做边(Edge)集合。

 

2. 图的定义

(1)无向边

若顶点x和y之间的边没有方向,则称该边为无向边(x,y)。

(x,y)与(y,x)意义相同,表示x和y之间有联系。

(2)无向图

若图中任意两个顶点之间的边均是无向边,则称该图为无向图。

 

(3)有向边 

若顶点x和y之间有向边,责成该边为有向边<x,y>

<x,y>与<y,x>意义不同,表示从x连接到y,x称为尾,y称为头。

(4)有向图

若图中任意两个顶点之间的边均是有向边,则称改图为有向图。

 

(5)度(Degree)的定义

顶点v度是和v相关联的边的数目,记为TD(v)。

入度:以v为头的边的数目,记为ID(v)。

出度:以v为尾的边的数目,记为OD(v)。

很显然:

TD(v) = ID(v) + OD(v)

E = [TD(v1) + TD(v2) + … + TD(vn)] / 2

E = ID(v1) + ID(v2) + … + ID(vn)

E = OD(v1) + OD(v2) + … + OD(vn)

 

(6)权(Weight)的定义

与图相关的数字叫做权,权常用来表示图中顶点之间的距离或者耗费。

 

3. 图的操作

l  创建图

l  销毁图

l  清空图

l  加入边

l  删除边

l  获取权

l  获取结点的度

l  获取图的结点数

l  获取图的边数

 

4. 图操作的实现

图在程序中表现为一种特殊的数据类型。

图的操作在程序中的表现为一组函数。

Graph* Graph_Create(int n);

void Graph_Destroy(Graph* graph);

void Graph_Clear(Graph* graph);

int Graph_AddEdge(Graph* graph, int v1, int v2, int w);

int Graph_RemoveEdge(Graph* graph, int v1, int v2);

int Graph_GetEdge(Graph* graph, int v1, int v2);

int Graph_TD(Graph* graph, int v);

int Graph_VertexCount(Graph* graph);

int Graph_EdgeCount(Graph* graph);

 

5. 程序—C语言描述图的结构

main.c

#include <stdio.h>

#include <stdlib.h>

#include "Graph.h"

 

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

 

int main(int argc, char *argv[])

{

    Graph* graph = Graph_Create(5);

   

    Graph_AddEdge(graph, 0, 1, 1);

    Graph_AddEdge(graph, 1, 0, 1);

   

    Graph_Destroy(graph);

   

         return 0;

}

Graph.h

 

#ifndef _GRAPH_H_

#define _GRAPH_H_

 

typedef void Graph;

typedef void Vertex;

 

/* 创建并返回有n个顶点的图 */

Graph* Graph_Create(int n);

 

/* 销毁graph所指向的图 */

void Graph_Destroy(Graph* graph);

 

/* 将graph所指图的边集合清空 */

void Graph_Clear(Graph* graph);

 

/* 在graph所指图中的v1和v2之间加上边,且边的权为w */

int Graph_AddEdge(Graph* graph, int v1, int v2, int w);

 

/* 将graph所指图中v1和v2之间的边删除,返回权值 */

int Graph_RemoveEdge(Graph* graph, int v1, int v2);

 

/* 将graph所指图中v1和v2之间的边的权值返回 */

int Graph_GetEdge(Graph* graph, int v1, int v2);

 

/* 将graph所指图中v顶点的度数 */

int Graph_TD(Graph* graph, int v);

 

/* 将graph所指图中的顶点数返回 */

int Graph_VertexCount(Graph* graph);

 

/* 将graph所指图中的边数返回 */

int Graph_EdgeCount(Graph* graph);

 

#endif

Graph.c

#include <malloc.h>

#include "Graph.h"

 

Graph* Graph_Create(int n)

{

    return NULL;

}

 

void Graph_Destroy(Graph* graph)

{

   

}

 

void Graph_Clear(Graph* graph)

{

   

}

 

int Graph_AddEdge(Graph* graph, int v1, int v2, int w)

{

    return 0;

}

 

int Graph_RemoveEdge(Graph* graph, int v1, int v2)

{

    return 0;

}

 

int Graph_GetEdge(Graph* graph, int v1, int v2)

{

    return 0;

}

 

int Graph_TD(Graph* graph, int v)

{

    return 0;

}

 

int Graph_VertexCount(Graph* graph)

{

    return 0;

}

 

int Graph_EdgeCount(Graph* graph)

{

    return 0;

}

 

小结:

图是一种扩展的树的结构,每个结点可一直想任意的其他的结点。

链表示特殊的树结构,树是特殊的图结构。

图这种数据结构常用语网络规划和路径规划等领域。

GPS相关产品中大量应用了图的结构和图的算法。

 

以上是关于数据--第40课 - 图的定义的主要内容,如果未能解决你的问题,请参考以下文章

第58课 自定义模型类(上)

第59课 自定义模型类(中)

第八课启航!第一个应用程序

数据-第5课-线性表的本质

数据--第23课 - 队列的优化实现

大话数据结构C语言40 图的存储结构(十字链表)