数据结构
小帅比simon
热爱学习,想参与到改变世界的组织中!!
展开
-
二插排序树
二分查找只适用于静态头文件原创 2014-05-20 00:58:44 · 976 阅读 · 0 评论 -
线性表的基本概念
线性表的基本概念线性表的基本概念线性表的定义数学定义性质基本操作1.线性表的定义线性表(List)是零个或多个数据元素的集合 线性表中的数据元素之间是有顺序的线性表中的数据元素个数是有限的线性表中的数据元素的类型必须相同 2.数学定义线性表是具有相同类型的 n( ≥ 0)个数据元素的有限序列 (a1, a2, …, an) ai是表项,n 是表长度。3.性质a0为线性表的第一个原创 2016-10-29 19:20:50 · 587 阅读 · 0 评论 -
线性表的顺序存储
线性表的顺序存储线性表的顺序存储基本概念设计和实现1 插入元素算法2 获取元素操作3 删除元素算法4 具体代码优缺点1.基本概念2.设计和实现2.1 插入元素算法判断线性表是否合法判断插入位置是否合法把最后一个元素到插入位置的元素后移一个位置将新元素插入线性表长度加12.2 获取元素操作判断线性表是否合法判断位置是否合法直接通过数组下标的方式获取元素2.3 删除元素原创 2016-10-29 22:36:10 · 463 阅读 · 0 评论 -
井号法创建二叉树
思路:利用前序遍历来建树(结点值陆续从键盘输入,用先序遍历的顺序为宜),后序遍历销毁一个树。#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <memory.h>#include <string.h>//二叉链表示法struct _bitTree{ int data;原创 2016-11-10 21:10:58 · 1167 阅读 · 0 评论 -
线性表的链式存储
线性表的链式存储线性表的链式存储基本概念设计与实现实现代码优缺点1. 基本概念链式存储定义 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息。 表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息数据结点 链表中代表数据元素的结点,包含指向下一个数据元素的原创 2016-10-30 14:22:56 · 1854 阅读 · 4 评论 -
中序和先序创建树
通过先序遍历找到根节点A,再通过A在中序遍历的位置找出左子树,右子树在A的左子树中,通过先序遍历的结果找出左子树的根节点,转步骤1在A的右子树中,通过先序遍历的结果找出右子树的根节点,转步骤1示例:先序遍历结果:ADEBCF 中序遍历结果:DEACFB原创 2016-11-10 22:03:41 · 398 阅读 · 0 评论 -
循环链表
循环链表循环链表基本概念设计与实现代码实现优缺点约瑟夫问题-循环链表典型应用1.基本概念循环链表的定义: 将单链表中最后一个数据元素(也去节点)的next指针指向第一个元素 循环链表拥有单链表的所有操作 创建链表 销毁链表 获取链表长度 清空链表 获取第pos个元素操作 插入元素到位置pos 删除位置pos处的元素新增功能:游标的定原创 2016-10-30 20:39:09 · 926 阅读 · 0 评论 -
树的非递归遍历
中序遍历的几种情况分析1:什么时候访问根、什么时候访问左子树、什么访问右子树 当左子树为空或者左子树已经访问完毕以后,再访问根 访问完毕根以后,再访问右子树。分析2:为什么是栈,而不是其他队列。 先走到的后访问、后走到的先访问,显然是栈结构分析3:结点所有路径情况步骤1: 如果结点有左子树,该结点入栈; 如果结点没有左子树,访问该结点;步骤2: 如果结点有右子树,重复步原创 2016-11-09 18:05:30 · 285 阅读 · 0 评论 -
线索化二叉树
概念普通二叉树只能找到结点的左右孩子信息,而该结点的直接前驱和直接后继只能在遍历过程中获得。 若可将遍历后对应的有关前驱和后继预存起来,则从第一个结点开始就能很快“顺藤摸瓜”而遍历整个树了。 线索化的目的就是将二叉树像普通双向链表一样遍历线索化过程就是在遍历过程(假设是中序遍历)中修改空指针的过程: 将空的lchild改为结点的直接前驱; 将空的rchild改为结点的直接后继。 创建原创 2016-11-12 16:42:45 · 505 阅读 · 0 评论 -
霍夫曼树简介
背景对于文本”BADCADFEED”的传输而言,因为重复出现的只有 ”ABCDEF”这6个字符,因此可以用下面的方式编码:接收方可以根据每3个bit进行一次字符解码的方式还原文本信息。但这样的编码方式需要30个bit位才能表示10个字符 那么当传输一篇500个字符的情报时,需要15000个bit位 在战争年代,这种编码方式对于情报的发送和接受是很低效且容易出错的。 如何提高收发效率?原创 2016-11-12 16:51:20 · 1629 阅读 · 0 评论 -
C++版本的冒泡排序
#include <iostream>using namespace std;#define MAXSIZE 100typedef int Status;#define OK 1#define ERROR 0template <typename T>class SqList{public: T r[MAXSIZE+1]; int length;public:原创 2016-11-13 18:20:36 · 362 阅读 · 0 评论 -
C++版本的简单选择排序
选择排序是先固定一个位置,将该位置的元素和无序序列中剩下的元素逐个比较,默认升序排列,若发现比该位置元素小的元素则交换位置,这样每一趟比较下来就会把整个序列中最小的元素放到这个固定的位置!通常这个固定位置先从1开始,然后2,3….以此类推!简单来说,就是在第i趟通过n-i次关键字之间的比较,从n-i+1个元素中选出关键字最小的记录,并和第i个元素交换。为了提高算法的效率,可以通过只记录最小元素的下标原创 2016-11-13 18:57:43 · 491 阅读 · 0 评论 -
C++版本直接插入排序
总体思想:将一个元素插入到已经排好序的有序表中,从而得到一个新的记录数增加1的有序表。 技巧是: 默认第一个元素是已经排好序的,后面的元素就是插入他的左边还是右边的问题,默认升序排列,比他小的插到左边,比他大的插到右边(实际上所有元素都在他右边,如果比他大就不交换即可)。 每一次比较都是将第i个元素和第i-1个元素比较,如果发现后面的元素小则表示需要将后面的元素插入到前面的有序表中,才会进行原创 2016-11-13 20:06:54 · 898 阅读 · 0 评论 -
C++版本堆排序
堆是一种特殊的完全二叉树。大顶堆:每个节点的值都大于或等于其左右孩子节点的值的完全二叉树小顶堆:每个节点的值都小于或等于其左右孩子节点的值的完全二叉树总体思想:将待排序的序列构造成一个大顶堆。此时整个序列的最大值就是对顶的根节点。将他和堆的末尾元素交换,再将剩余的n-1个元素构成新的大顶堆,在得到整个序列的第二大的元素,如此反复执行就会得到一个有序的序列了。 注意:这里使用的是层序遍历法:原创 2016-11-13 23:21:01 · 689 阅读 · 0 评论 -
C++版本的希尔排序
前面三种排序算法(冒泡、选择以及插入排序)的时间复杂度都是O(n2n^{2}),相对来说性能最好的是插入排序,在元素个数少,且原序列基本有序的前提下,是非常高效的!所以对于人一个无序序列,我们可以认为的制造上述条件:元素个数少—分组基本有序—按照增量进行分组这样将相距某个增量的众多元素组成一个子序列,然后在子序列内部分别进行直接插入排序,得到的序列就是所谓的基本有序序列,之后就可以按照增量为1原创 2016-11-13 21:37:16 · 449 阅读 · 0 评论 -
C++版本归并排序
总体思想假设初始序列含有n个元素,则可以看成n个有序的子序列,每个子序列只有一个元素,然后两两归并,得到(n/2+0.5)个长度为2或者1的有序子序列,再两两归并……如此反复执行,直到得到一个长度为n的有序序列为止,这种排序方法称之为2路归并排序。技巧先要将原始序列每次按照“二分法”分成两个子序列,4个子序列,8个子序列,直到n个子序列再按照两两归并的步骤往上归并,子序列又从n个变为(n/2+0原创 2016-11-14 11:25:03 · 664 阅读 · 0 评论 -
数据结构基本概念
基本概念基本概念数据结构起源数据结构基本概念数据结构的逻辑关系数据结构的物理结构数据运算算法数据结构和算法的关系算法特点算法效率的度量1事后统计法2事前分析估算3常规估算注意事项大O表示法空间复杂度面试题时间和空间的互换1.数据结构起源计算机除了数值计算问题以外还需要解决现实生活中很多的问题,而这些问题涉及到现实中很多复杂的对象,不同对象之间具有复杂的关系,数据结构正是原创 2016-10-29 18:17:55 · 562 阅读 · 0 评论 -
顺序表的模板实现
头文件#pragma oncetemplate <typename T>class SeqList{public: SeqList(int capcity); ~SeqList(); int getLength(); int getCapacity(); int insert(T &t, int pos); int get(int pos,T& t);原创 2016-11-10 11:23:46 · 433 阅读 · 0 评论 -
树的拷贝
1.合法性检测,同时也是递归拷贝结束的条件 2.递归拷贝左子树,返回新的左子树的指针 3.递归拷贝右子树,返回新的右子树的指针 4.给新的根节点分配内存 5.将上述得到的新左右子树指针初始化新的根节点 6.将形参根节点的数据复制到新根节点的数据域;BiTNode * CopyTree(BiTNode * T){ BiTNode * newRoot = NULL; BiTN原创 2016-11-09 15:01:28 · 862 阅读 · 0 评论 -
插值法查找
#include #include #define SIZE 20void print_array(int a[], int len){ int i = 0; for (i = 0; i < len; i++){ printf("%d,", a[i]); } printf("\n");}void swap(int a[], int i, int j){ int原创 2014-05-19 18:22:07 · 653 阅读 · 0 评论 -
没有递归的二分查找
开销较小#include #include #define SIZE 20void print_array(int a[], int len){ int i = 0; for (i = 0; i < len; i++){ printf("%d,", a[i]); } printf("\n");}void swap(int a[], int i, int j){原创 2014-05-19 17:31:44 · 542 阅读 · 0 评论 -
双向链表
双向链表双向链表基本概念设计和实现代码实现优缺点1.基本概念单链表的尴尬 单链表的结点都只有一个指向下一个结点的指针 单链表的数据元素无法直接访问其前驱元素 逆序访问单链表中的元素是极其耗时的操作!len = LinkList_Length(list);for (i=len-1; len>=0; i++) //O(n){LinkListNode *p = LinkLi原创 2016-11-03 16:37:38 · 556 阅读 · 0 评论 -
顺序栈的设计和实现
顺序栈的设计和实现顺序栈的设计和实现基本概念常用操作顺序栈的示意图设计和实现1.基本概念栈是一种 特殊的线性表 栈仅能在线性表的一端进行操作栈顶(Top):允许操作的一端栈底(Bottom):不允许操作的一端 2.常用操作创建栈销毁栈清空栈进栈出栈获取栈顶元素获取栈的大小 3.顺序栈的示意图4.设计和实现这里我们用尾插法(再线性表的尾部插入栈元素)来描述栈的设计与实原创 2016-11-03 22:16:38 · 878 阅读 · 0 评论 -
链式栈
链式栈链式栈基本概念设计和实现1.基本概念2.设计和实现头文件#ifndef _MY_LINKSTACK_H_#define _MY_LINKSTACK_H_#include <stdio.h>#include <stdlib.h>#include <memory.h>#include "TLinkList.h"typedef void LinkStack;//数据类型封装--栈起原创 2016-11-04 16:44:46 · 292 阅读 · 0 评论 -
栈的应用1:就近匹配
几乎所有的编译器都具有检测括号是否匹配的能力 如何实现编译器中的符号成对检测?#include <stdio.h> int main() { int a[4][4]; int (*p)[4]; p = a[0]; return 0; 算法思路 (1)从第一个字符开始扫描 (2)当遇见普通字符时忽略,当遇见左符号时压入栈中 (3)当遇见右符号时从栈中弹出栈顶符号,并进行匹配匹配成功:继续读原创 2016-11-04 18:21:17 · 416 阅读 · 0 评论 -
栈的应用2:中缀转后缀及计算
栈的应用2:中缀转后缀及计算栈的应用2中缀转后缀及计算基本概念中缀表达式转后缀表达式计算后缀表达式代码实现基于链式栈-后缀表达式的四则混合运算计算器基本概念中缀表达式计算机的本质工作就是做数学运算,比如计算机可以读入字符串: “9 + (3 - 1) * 5 + 8 / 2”并计算。我们习惯的数学表达式叫做中缀表达式===》符合人类思考习惯后缀表达式 波兰科学家在20世纪50年代提原创 2016-11-05 20:37:13 · 1066 阅读 · 1 评论 -
顺序队列
顺序队列顺序队列基本概念常用操作代码实现基本概念队列是一种特殊的线性表队列仅在线性表的两端进行操作队头(Front):取出数据元素的一端(虽然用顺序表的头部和尾部效果一样,但这里我们使用顺序表的头部作为队列头部–从这里取出元素)队尾(Rear):插入数据元素的一端(这里我们使用顺序表的尾部作为队列尾部部–从这里插入元素))队列不允许在中间部位进行操作! 常用操作销毁队列清空队列原创 2016-11-05 22:22:29 · 398 阅读 · 0 评论 -
链式队列的代码实现
头文件#ifndef __LINK_QUEUE_H__#define __LINK_QUEUE_H__#include <stdio.h>#include <stdlib.h>#include <memory.h>#include "TLinkList.h"typedef void LinkQueue;typedef struct _tagNode{//和链式栈一样需要把队列的业务节点包原创 2016-11-06 13:15:28 · 578 阅读 · 0 评论 -
树的基本概念
输的特点: 非线性结构,一个直接前驱,但可能有多个直接后继(1:n)原创 2016-11-06 15:31:00 · 258 阅读 · 0 评论 -
二叉树的基本概念
完全二叉树和满二叉树是最简单最有规律的,可以研究透了以后,其他的树转换成二叉树来解决!研究表明:所有的树都可以转换为二叉树。原创 2016-11-06 16:20:56 · 400 阅读 · 0 评论 -
二叉树的表示
二叉链表示法#include <stdio.h>#include <stdlib.h>#include <memory.h>//二叉链表示法struct _bitTree{ int data; struct _bitTree * lchild, *rchild;};typedef struct _bitTree BiTNode;typedef struct _bitTr原创 2016-11-06 17:48:20 · 3257 阅读 · 0 评论 -
树的遍历
#include <stdio.h>#include <stdlib.h>#include <memory.h>//二叉链表示法struct _bitTree{ int data; struct _bitTree * lchild, *rchild;};typedef struct _bitTree BiTNode;typedef struct _bitTree* BiT原创 2016-11-09 11:15:16 · 237 阅读 · 0 评论 -
求树的叶子个数
void countLeaf(BiTNode * T,int *_sum){ if (T != NULL) { if (T->lchild == NULL && T->rchild == NULL) { (*_sum)++; } if (T->lchild) {原创 2016-11-09 13:08:41 · 912 阅读 · 0 评论 -
求树的高度
1.进行合法性判断,也是递归结束的条件 2.递归求出左子树的高度 3.递归求出右子树的高度 4.比较左右两边高度大小,选择大的那个加上“根”节点,这里的根是相对于每一个子树/节点的。 5.返回最后的高度int Depth(BiTNode * T){ int ret = 0; int dep_left = 0, dep_right = 0; if (T ==原创 2016-11-09 13:30:34 · 708 阅读 · 0 评论 -
C++版本快速排序
总体思想先找到一个枢轴,让他作为分水岭。通过一趟排序将待排序的记录分割成独立的两部分,前面一部分都比枢轴小,后面一部分逗比枢轴大,然后又分别对这两部分记录继续进行递归的排序,达到整个序列有序的目的。核心分离算法如何根据枢轴将无序序列分成两个独立的部分是快速排序的关键,具体做法是:采用两个辅助变量,一个指向待排序序列的第一个元素(low),另一个指向最后一个元素(high),这里的low和high都原创 2016-11-15 10:37:11 · 2074 阅读 · 0 评论