前言
提示:这里可以添加本文要记录的大概内容:
例如:随着计算机网络的发展,编程成了一种很常见且重要的职业,学好编程就要学好数据结构,下面将介绍数据结构中的图结构。
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是“图”
图(Graph)结构是一种非线性的数据结构,图在实际生活中有很多例子,比如交通运输网,地铁网络,社交网络,计算机中的状态执行(自动机)等等都可以抽象成图结构。图结构比树结构复杂的非线性结构。
二、图的基础知识和表示
1.图的基础
2.图的分类
有向图和无向图
带权图和不带权图
邻接矩阵
带权值的图,不连通的边用无穷表示,连通的边用边的权值表示。
代码如下(示例):
//数据结构之图; #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(void) { int Graph[5][5] = { 0 };//先初始化为零。 Graph[0][2] = 1; Graph[0][4] = 1; Graph[1][0] = 1; Graph[1][2] = 1; Graph[2][3] = 1; Graph[3][4] = 1; Graph[4][3] = 1; for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { printf("%5d", Graph[i][j]); } putchar('\n'); } }
2.图的另一种表示——邻接表
邻接表是一种顺序表和链表的组成结构,顺序表的每一个结点都是一个链式表的头结点。这种表可以运用到散列表中,线性探测法。前面的散列表已经介绍。
代码如下(示例):
//图——邻接表 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<Windows.h> #include<string.h> #define true 2 #define false -2 #define ok 1 #define erro -1 typedef int elemstyle; //构建链表结构体; typedef struct node { elemstyle key; struct node* next; }GraphNode; typedef struct graph { GraphNode* pn; int n;//代表顺序表的长度; }GraphList; //创建结点; GraphNode* creatGraphNode(elemstyle val) { GraphNode* newnode = (GraphNode*)malloc(sizeof(GraphNode)); newnode->key = val; newnode->next = NULL; return newnode; } //邻接表的初始化; GraphList* Init_Graph(int n) { GraphNode* pn = (GraphNode*)malloc(sizeof(GraphNode)*n); for (int i = 0; i < n; i++) { pn[i].key = i; pn[i].next = NULL; } GraphList* pt = (GraphList*)malloc(sizeof(GraphList)); pt->n = n; pt->pn = pn; return pt; } //邻接表创建成功后,就可以对有联系的结点进行连接; int insert_GraphNode(GraphList*pt,int pos,int pval)//pos代表连接的数据,pval代表连接数据的值. { assert(pt != NULL); GraphNode* Node = creatGraphNode(pval); GraphNode* pmove = &(pt->pn[pos]); GraphNode* curr=pt->pn[pos].next; while (curr) { pmove = curr; curr = curr->next; } pmove->next = Node; return ok; } //遍历邻接表; int printGraph(GraphList* pt) { assert(pt != NULL); for (int i = 0; i < pt->n; i++) { printf("%3d:", pt->pn[i].key); GraphNode* curr = pt->pn[i].next; while (curr) { printf("->%3d", curr->key); curr = curr->next; } putchar('\n'); } return true; } //调试函数; int main(void) { GraphList* pt; int n; scanf("%d", &n); pt=Init_Graph(n); insert_GraphNode(pt, 0, 2); insert_GraphNode(pt, 0, 3); insert_GraphNode(pt, 1, 0); insert_GraphNode(pt, 1, 2); insert_GraphNode(pt, 2, 3); insert_GraphNode(pt, 3, 4); printGraph(pt); }
该处使用的url网络请求的数据。
这里只是简单的一个邻接表的实现;可以参考一下。
总结
图作为一种数据结构,他与树的不同在于它不再是一种简单的线性结构,他是一种复杂的非线性结构,具有更大的使用价值,如和广义表,散列表结合起来使用更好,可以解决很多问题。