数据结构
haofight
这个作者很懒,什么都没留下…
展开
-
字符串模式匹配
#include <stdio.h>#include <stdlib.h>#include<string.h>//字符串模式匹配int indexString(char s[],char t[],int pos){ int i = pos,j=1; while(i<=strlen(s) && j<=strlen(t)) { if(s[i-1]==t[j原创 2016-12-16 16:00:17 · 271 阅读 · 0 评论 -
哈夫曼树以及哈夫曼编码
1.哈夫曼树 假设有n个权值{w1, w2, …, wn},试构造一棵含有n个叶子结点的二叉树,每个叶子节点带权威wi,则其中带权路径长度WPL最小的二叉树叫做最优二叉树或者哈夫曼树。 特点:哈夫曼树中没有度为1的结点,故由n0 = n2+1以及m= n0+n1+n2,n1=0可推出m=2*n0-1,即一棵有n个叶子节点的哈夫曼树共有2n-1个节点2.哈夫曼编码 通信传原创 2017-01-11 15:39:10 · 1386 阅读 · 0 评论 -
图的遍历--使用邻接表作为存储结构的遍历(DFS、BFS)C语言
#include <stdbool.h>#include <stdlib.h>#include <stdio.h> #define MAX_VERTEX_NUM 20 //最大顶点个数 typedef char VertexType;typedef int VRType;typedef int InfoType; //图中边上的权值信息 typedef int QElemType原创 2017-01-16 20:37:29 · 8410 阅读 · 0 评论 -
图的遍历(DFS、BFS)使用邻接矩阵(数组)作为存储结构--C语言
#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#include <limits.h>#define MAX_VERTEX_NUM 20 //最大顶点个数 #define INFINITY INT_MAX //最大值∞ typedef char VertexType; //顶点向量类型 typedef int V原创 2017-01-17 17:34:11 · 5917 阅读 · 1 评论 -
Prim算法求图的最小生成树--C代码
#include<stdio.h>#include<stdlib.h>#include<limits.h>#include<stdbool.h>/*---prim算法时间复杂度O(n^2),n为顶点数,时间复杂度与边的数目无关,因此适用于求边稠密的图的最小生成树---*/ #define MAX_VERTEX_NUM 20 //图中顶点最大个数 #define INFINITY INT原创 2017-01-20 14:23:11 · 2459 阅读 · 3 评论 -
求连通图的关节点(割点)--C语言
最简单也是最直接的算法是,删除一个点然后判断连通性,如果删除此点,图不再连通,则此点是割点,反之不是割点(图的连通性一般通过深搜来判定,是否能一次搜索完 全部顶点);通过深搜优先生成树来判定。从任一点出发深度优先遍历得到优先生成树,对于树中任一顶点V而言,其孩子节点为邻接点。由深度优先生成树可得出两类割点的特性:(1)若生成树的根有两棵或两棵以上的子树,则此根顶点必为割点。因为图中不存在连接不同子原创 2017-01-21 19:51:20 · 3364 阅读 · 0 评论 -
拓扑排序--C语言
基本思想: 1、在有向图中选一个没有前驱(入度为0)的顶点且输出; 2、从图中删除该顶点和所有以它为尾的边。 重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止(此时说明有向图中存在环)。#include <stdio.h>#include <stdlib.h>#include <stdbool.h>/*--有向无环图拓扑排序--*/原创 2017-01-23 20:58:29 · 521 阅读 · 0 评论 -
二叉查找树(二叉排序树)创建、插入、删除、查找-C语言
二叉查找树:或者是一颗空树;或者是具有以下性质的二叉树:(1)若它的左子树不为空,则左子树上所有结点的值都小于根结点的值;(2)若它的右子树不为空,则右子树所有结点的值均大于它的根结点的值;(3)左右子树分别为二叉查找树;#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#define N 7 //插入查找树数组长度 /* 二原创 2017-01-12 21:10:40 · 20281 阅读 · 6 评论 -
合并两个有序链表(非递归与递归)
基本思路:非递归合并过程中直接将原链表的节点从原链表中取出链入合并链表中。递归合并中将链入节点后剩余的链表作为新的链表再递归合并。typedef struct LNode{ int data; struct LNode *next;}LNode,*LinkList;//合并两个有序链表LinkList mergeList(LNode *head1,LNode *head2){原创 2016-12-21 17:43:22 · 604 阅读 · 0 评论 -
C语言实现栈(栈的链式实现)
#include <stdio.h>#include <stdlib.h>/* 栈的创建及其应用 */typedef struct Node{ int data; struct Node *next;}Node, *Pnode;typedef struct Stack{ Pnode top; Pnode base;}Stack, *Pstack;//创建一个空原创 2017-11-15 13:14:09 · 679 阅读 · 0 评论 -
队列基本操作-C语言
#include <stdio.h>#include <stdlib.h>/* 队列 */typedef struct Node{ int data; struct Node *next;}Node,*PNode;typedef struct Queue{ PNode front; PNode rear;}Queue, *PQueue;//初始化队列 PQue原创 2017-11-20 21:17:53 · 542 阅读 · 0 评论 -
最短路径 (单源最短路径Dijkstra和任意两点最短路径Floyd) C实现
#include "stdafx.h"#include #include #include #define MAX_VERTEX_NUM 20#define INFINITY INT_MAXtypedef struct MGraph{ int vexnum, arcnum; int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];原创 2018-02-02 14:24:35 · 1947 阅读 · 0 评论 -
关键路径 C实现
#include "stdafx.h"#include #include #define MAX_VERTEX_NUM 20typedef struct ArcNode{ int data; int weight; struct ArcNode *next;}ArcNode, *PArcNode;typedef struct VNode{ in原创 2018-01-29 20:20:26 · 584 阅读 · 0 评论 -
二叉平衡树(AVL)-C语言
#include <stdio.h>#include <stdlib.h>#define max(a,b) (a>=b?a:b)#define min(a,d) (a<b?a:b)#define N 7 //数组长度/* 二叉平衡树AVL */typedef int Elemtype;typedef struct AVLNode{ Elemtype data; st原创 2017-01-13 15:54:29 · 584 阅读 · 0 评论 -
C语言字符串查找基础----strchr()、strrchr()、strpbrk()、strstr()
1、查找一个字符 在一个字符串查找一个特定字符最容易的方法是使用strchr和strrchr函数,原型如下所示:char *strchr(char const *str, int ch);char *strrchr(char const *str,int ch);注意:它们的第二个参数是一个整型值。但是,它包含了一个字符值。strchr返回字符第一次出现的位置,strrchr返回字符最后原创 2016-12-30 17:42:59 · 1670 阅读 · 1 评论 -
先序中序重建二叉树
基本思路: 1、先序遍历第一个结点作为根节点。 2、在中序遍历中查找根节点的位置,以此为界将中序遍历序列划分为左右两个序列(左、右子树)。 3、根据左、右子树在中序序列中的结点个数,将先序序列去掉根结点后的序列划分为左、右两个序列,它们分别为左、右子树的先序序列。 4、对左、右子树的先序序列和中序序列递归实施同样方法,直到左、右子树为空。#include <stdio.h>#include原创 2017-01-04 16:20:40 · 405 阅读 · 0 评论 -
hanio塔问题
#include <stdio.h>#include <stdlib.h>int c=0;//移动次数void move(char x,int n,char z){ printf("%d. Move disk %d from %c to %c \n",++c,n,x,z);}void hanio(int n,char x,char y,char z){ if(n==1)原创 2016-12-16 15:55:58 · 1294 阅读 · 0 评论 -
求二叉树的高度,宽度、节点个数、叶子节点个数
#include<stdio.h>#include<stdlib.h>#include<stdbool.h>/*实现求二叉树的高度,宽度、节点个数、叶子节点个数*/typedef struct NODE{ int data; struct NODE *lchild,*rchild; }TNode,*PTNode; PTNode createtree() { PTN原创 2016-12-16 15:49:23 · 4677 阅读 · 0 评论 -
二叉树的递归遍历与非递归遍历
二叉树的递归遍历与非递归遍历#include <stdio.h>#include <stdlib.h>#include <stdbool.h>/* 本程序实现二叉树的创建,递归遍历与非递归遍历 */ typedef struct TNODE { int data; struct TNODE *lchild,*rchild; }TNode,*PNode; //构造二叉树 P原创 2016-12-16 15:46:06 · 304 阅读 · 0 评论 -
计算二叉树中最远节点距离
二叉树最远节点距离:以根节点为轴左右子树最大深度之和与以各个子树的根节点为轴左右子树的最大深度之和的较大者。思路一:解决这个问题最直接的方式就是遍历。对每个节点求深度,之后再与保存的最大深度maxdepth进行对比,但是时间复杂度为O(n^2),这是一种比较糟糕的时间复杂度。 思路二:针对思路一,重复了大量的遍历工作,对每一个节点求深度,对最深的节点遍历了2^n次,没有线索化的二叉树遍历,最常用的原创 2016-12-18 00:14:01 · 4906 阅读 · 1 评论 -
双向链表创建、插入、删除
创建含有N各节点的双向链表,实现在链表中插入、删除节点。#include<stdio.h>#include<stdlib.h>typedef struct DulNode{ int data; struct DulNode *prior; struct DulNode *next;}DNode,*DLinkList;//创建含有n个节点的双链表DLinkList cre原创 2016-12-21 16:20:12 · 544 阅读 · 0 评论 -
以O(1)时间删除单链表一个节点
基本思路:把要删除的节点的下一个节点复制到当前节点,然后删除被复制了的下一个节点,即使用下一个节点覆盖当前节点达到删除当前节点的目的,时间复杂度为O(1)。当要删除的节点是尾节点时,仍然需要从头结点开始遍历,时间复杂度仍为O(n)。#include <stdio.h>#include <stdlib.h>typedef struct LNode{ int data; struct原创 2016-12-21 16:53:16 · 371 阅读 · 0 评论 -
单链表基本操作:创建、插入、删除、获取
#include <stdio.h>#include <stdlib.h>typedef struct LNode{ int data; struct LNode *next;}LNode,*LinkList;//创建一个含有n个元素的单链表LNode *createList(int n){ LNode *head = NULL,*p1,*p2; for(in原创 2016-12-21 16:59:24 · 583 阅读 · 0 评论 -
创建逆序输入值的单链表
基本思路:使用两个临时指针p1,p2,p1指向新创建的节点,p2指向创建过程中链表临时头结点。新节点创建后将其作为链表新的头节点。typedef struct LNode{ int data; struct LNode *next;}LNode,*LinkList;//创建一个逆序输入的n个元素的链表LNode *createEndList(int n){ LNode *原创 2016-12-21 17:24:39 · 589 阅读 · 0 评论 -
翻转链表
//翻转一个链表#include <stdio.h>#include <stdlib.h>typedef struct LNode{ int data; struct LNode *next;}LNode,*LinkList;//创建一个含有n个元素的单链表LNode *createList(int n){ LNode *head = NULL,*p1,*p2;原创 2016-12-21 20:03:25 · 355 阅读 · 0 评论 -
获取链表倒数第K个节点值
基本思想:设置两个指正,一个快指针pfast,一个慢指针pslow,首先快指针从头结点提前走K-1步,然后两个指针同时开始往后走,当快指针走到尾结点时,慢指针所指结点就是倒数第K个结点。typedef struct LNode{ int data; struct LNode *next;}LNode,*LinkList;//输出链表倒数第K各节点int getTailK(LinkL原创 2016-12-21 20:14:15 · 379 阅读 · 0 评论 -
C语言字符串操作----strlen()、strcpy()、strcat()、strcmp()
C语言中并没有没有显示的字符串数据类型,因此字符串以字符串常量的形式或者存储于字符数组中。字符串常量很适合用于那些程序不会对它们进行修改的字符串,所有其他字符串必须存储于字符数组或动态分配的内存中。注意:字符串是以一个位模式为全0的NUL字节结尾,因此,字符串所包含的字符内部不能出现NUL字节。C语言中 头文件string.h包含使用字符串函数所需的原型和声明。尽管并非必需,但在程序中包含头文原创 2016-12-24 19:25:51 · 3201 阅读 · 0 评论 -
判断二叉树是否为完全二叉树
基本思路:使用队列按层次遍历二叉树,遍历过程中将二叉树的所有结点依次入队。当出队遇见一个NULL结点时,若遍历其后结点都为NULL则为完全二叉树,否则不是完全二叉树。因为层次遍历完全二叉树时,当遍历到空结点时前面所有非空结点已经被遍历完了,若空结点之后还有非空结点则不是完全二叉树。#include <stdio.h>#include <stdlib.h>#include <stdbool.h>/原创 2017-01-04 16:05:10 · 2594 阅读 · 0 评论 -
拓扑排序 C实现
#include "stdafx.h"#include #include #define MAX_VERTEX_NUM 20typedef struct ArcNode{ int data; struct ArcNode *next;}ArcNode, *PArcNode;typedef struct VNode{ int indegree;原创 2018-01-29 20:22:34 · 560 阅读 · 0 评论