数据结构学习
学习数据结构的过程
大芝士球
一个平凡人心中的波澜壮阔
展开
-
图的深度/广度优先遍历DFS和BFS(邻接表实现)c语言
目录定义邻接表存储图深度优先遍历广度优先遍历:BFS部分完整代码定义要实现该算法首先要知道邻接表的概念。邻接表是一种常用的图的存储结构,它的结构特点是:顶点由一个一维数组存储;邻接点用链表存储相比于单纯用数组实现的邻接矩阵,邻接表可以避免空间浪费其图解如下:firstedge指向边表第一个结点。边表的adjvex的值代表与V0顶...原创 2018-02-08 19:48:51 · 31779 阅读 · 13 评论 -
图的深度优先遍历DFS (邻接矩阵实现) c语言
图的遍历是指从图中的某一顶点出发,按照一定的策略访问图中的每一个顶点。每个顶点有且只能被访问一次。深度优先遍历也叫深度优先搜索(Depth First Search)。它的遍历规则:先选择一个初始顶点,再规定一个方向,例如往右边一直遍历。于是就往右边一直走,把访问过的顶点做好标记,沿着右边访问完后,回溯到之前访问过的顶点,找找还有没有顶点没有访问的,当所有顶点被访问,完成遍历。DFS是...原创 2018-02-08 16:30:42 · 21007 阅读 · 17 评论 -
图的广度优先遍历BFS(邻接矩阵实现)c语言
广度优先遍历也叫广度优先搜索(Breadth First Search)。它的遍历规则:先访问完当前顶点的所有邻接点。 先访问的顶点的邻接点先于后访问顶点的邻接点被访问。 算法思想: 使用队列的数据结构(FIFO (First In First Out)),将一个顶点加入队列,然后在队列中删除顶点,并且将该顶点相连的所有顶点依次加入队列中,再循环处理这些顶点,直至所有...原创 2018-02-08 21:38:05 · 20914 阅读 · 5 评论 -
(图)最小生成树算法之普里姆算法
图的基本概念里有提到,一个连通图的生成树是一个极小的连通子图,它含有图中的全部顶点,但只有构成一棵树的n-1条边。最小生成树:构造连通图的最小代价生成树即在上图(网结构)中找到权值之和最小的生成树的路径。实现最小生成树有两种算法:普里姆(Prim)算法构造邻接矩阵实现void MiniTree(MGraph G){ int min,i,j,k; int adjvex[MAX]; ...原创 2018-02-09 17:28:35 · 519 阅读 · 0 评论 -
(图)最短路径的求法之迪杰斯特拉算法
对于网图而言,最短路径指两顶点之间经过的边上权值和最少的路径,并且路径上的第一个顶点是源点,最后一个顶点是 终点。迪杰斯特拉dijkstra算法: 其本质是一种贪婪算法也是最经典的单源最短路径算法假设源点是V1,终点是V8,求其最短路径。我们先求V1到V2 V4 V3哪条路径最短,答案是到V2最短。由于V2与V4 V5连线,V2->V5=7 V2->V4=1 故选择V4于是再求V1...原创 2018-02-09 21:55:11 · 534 阅读 · 0 评论 -
(图)最短路径之弗洛伊德算法
弗洛伊德Floyd算法:其本质是动态规划算法,也是经典的多源最短路径算法之所以称为经典便是因为该算法非常简短:该算法的时间复杂度:O(n的三次方)这个算法短的离谱,以致于我们通常直接将它背了下来当模板使用,而不像学dijkstra那时候一步步理解它是如何贪心的.那么,为什么floyd算法是这个样子的呢?或者说,为什么这样就能求出所有点到所有点的最短路径?它的递推公式是:D[v][w]=min{D[...转载 2018-02-10 16:02:14 · 749 阅读 · 1 评论 -
(图)有向无环图的应用:拓扑排序
AOV网(Activity On Vertex Network):在一个表示工程的有向图中,顶点表示活动,弧表示活动之间的优先关系设G={V,E}是一个具有n个顶点的有向图,V中的顶点序列V1,V2,......,Vn,满足若从顶点Vi到Vj有一条路径,则在顶点序列中顶点Vi必须在Vj之前。这样的顶点序列称为拓扑序列。在上图的AOV网中,拓扑序列有多条。序列V0 V1 V2 V3 V4 V5 V6...原创 2018-02-10 17:24:06 · 1922 阅读 · 0 评论 -
(图)关键路径算法 (含AOV AOE网比较)
拓扑排序的意义是解决工程的顺序进行问题,但有时我们也需要解决工程完成需要的最短时间问题。AOV网和AOE网:AOE(Activity On Edge)网:顶点表示事件,弧表示活动,弧上权值表示活动所需时间网中没有入边的顶点称为始点或源点,没有出边的顶点称为终点或汇点在AOE网中,只有一个顶点代表的事件发生后,从该顶点出发的各个弧所代表的活动才能开始,只有以弧头关联一个顶点的各个弧所代表的活动都已结...转载 2018-02-11 11:39:27 · 2845 阅读 · 0 评论 -
树 二叉树的建立和基本操作
二叉树是应用非常广泛的结构,其基本实现如下:结点结构:也就是使用二叉链表实现typedef struct Node //树结点结构{ char data; struct Node *lchild; struct Node *rchild; }BitreeNode,*Bitree;//先序建立二叉树 Bitree create(){ Bitree T; char ch;...原创 2018-02-12 18:39:37 · 1054 阅读 · 0 评论 -
树 赫夫曼树的定义及建立 、赫夫曼编码的定义
以下有叶子结点带权的二叉树:路径:从树中一个结点到另一个结点之间的分支构成两个结点之间的路径路径长度:路径上的分支数目树的路径长度:根结点到每一个结点的路径长度和在上图树的路径长度就为:1+1+2+2+3+3+4+4=20带权路径长度WPL:从该结点到根结点之间的路径长度与结点上权的乘积上图树的WPL:5*1+15*2+40*3+30*4+10*4=315带权路径长度最小的二叉树称为赫夫曼树,也叫...原创 2018-02-13 12:22:25 · 550 阅读 · 0 评论 -
KMP模式匹配算法求next数组
KMP模式匹配算法是串部分的一个重要算法,需要知道求next和nextval数组的方法next数组的求法next数组中规定下标1、2的字符的next数组值是0、1从下标为3的字符开始,判断P[i-1]=P[next[i-1]]是否成立即第i个字符的前一个字符是否和第next[i-1]字符是一样的,若是一样的———next[i]=next[i-1]+1若不一样————往前继续找,判断P[i-1]=P...原创 2018-02-14 11:15:56 · 9251 阅读 · 3 评论 -
栈的创建和基本操作
栈(LIFO):限定仅在表尾进行插入和删除操作的线性表,简单来说就是最后一个进入最早出来顺序栈用数组实现,下标为0的一端作为栈底,另一端为栈顶,用top作为栈顶指针我们定义空栈时top=-1栈结构:typedef struct SqStack{ int data[MAX]; int top; }SqStack;基本操作://初始化栈 void Ini...原创 2018-02-14 16:54:54 · 14574 阅读 · 4 评论 -
队列的创建以及基本操作
队列(FIFO)是只允许在一段插入,另一端删除的线性表,遵循先进先出原则,队头删除,队尾插入。顺序队列使用用数组存储 初始条件 front =rear=0满队列:rear=m 容量m空队列: front=rear 结构:typedef struct{ int data[MAX]; int front,rear;}Queue;操作:/初始化队列Queue InitQueue()...原创 2018-02-15 12:14:57 · 14949 阅读 · 2 评论 -
递增链表的创建
递增链表就是其中的元素呈递增排序方式:#include<stdio.h>#include<stdlib.h>typedef struct Node *SNode;struct Node{ int data; SNode next;};SNode createhead()//创建头结点 { SNode head; head=(SNode)malloc...原创 2018-02-16 14:23:43 · 1551 阅读 · 0 评论 -
单链表的创建及基本操作
链表作为数据结构中最容易理解的结构,我们需要对它的基本操作非常熟悉结点结构:typedef struct Node{ int data; struct Node *next;}Node,*snode;基本操作:初始化://初始化 snode init(){ snode head=(snode)malloc(sizeof(Node)); if(!head) return NUL...原创 2018-02-17 17:47:22 · 486 阅读 · 0 评论 -
单链表的就地逆置
单链表的就地逆置有多种方法,这里说说迭代与递归迭代其中使用了头插法void converse(Linklist *head){ Linklist *p1,*p2; p1=head->next; head->next=NULL; while(p1) { p2=p1; p1=p1->next; p2->next=head->ne...原创 2018-02-25 22:23:58 · 612 阅读 · 0 评论 -
链表问题
1.补充函数,功能是删除链表中所有值为x的结点结构体:typedef int datatype; typedef struct link_node{ datatype info; struct link_node *next; }node;typedef node *linklist;待补充函数:linklist delallx(linklist head,int x){}...原创 2018-04-09 22:18:30 · 197 阅读 · 0 评论 -
PTA 数据结构与算法习题集 ~
6-1 单链表逆转(20 分)本题要求实现一个函数,将给定的单链表逆转。函数接口定义:List Reverse( List L );其中List结构定义如下:typedef struct Node *PtrToNode;struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */...原创 2018-04-18 22:04:49 · 6139 阅读 · 0 评论 -
MOOC 听课笔记 -数据结构
浙大-第一章 基本概念最大子列和问题:给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。...原创 2018-04-19 20:52:08 · 324 阅读 · 0 评论