数据结构
文章平均质量分 55
为啥不能修改昵称啊
这个作者很懒,什么都没留下…
展开
-
外部排序
外部排序外部排序外存,内存之间的数据交换外部排序的原理多路平衡归并败者树置换-选择排序(生成初始归并段)最佳归并树外部排序外存,内存之间的数据交换外部排序的原理各个缓冲区的大小应和磁盘块的大小相等多路平衡归并这里只要有一个缓冲区空了,就应立即用归并段的下一块补上,而不能直接将27输出到输出缓冲区中归并后的结果会写到磁盘的另一篇空间中,而释放掉原来的空间,这里为了演示美观就把归并后的结果在视图上挪到了原来的空间增加归并的路数,减少归并的趟数,这样就可以减少读写磁盘的趟原创 2021-08-17 18:23:45 · 126 阅读 · 0 评论 -
排序(内部排序)+外部排序
排序插入排序直接插入排序折半插入排序希尔排序基数排序外存,内存之间的数据交换外部排序的原理多路平衡归并败者树置换选择排序最佳归并树排序可视化过程插入排序直接插入排序无哨兵//直接插入排序 没有哨兵,数组0的位置也存放的是待排元素void InsertSort(int A[], int n){ int i,j,temp;//因为A[0]也可以存放数据元素,所以i从1开始 for(i=1; i<n; i++){//将各元素插入已排好序的序列中 if(A[i]原创 2021-08-16 21:55:46 · 243 阅读 · 0 评论 -
查找
查找顺序查找一般线性表的顺序查找有序表的顺序查找折半查找顺序查找一般线性表的顺序查找//顺序查找的实现typedef struct{//查找表的数据结构(顺序表) ElemType *elem;//动态数组基址 int TableLen;//表长}SSTable;//顺序查找,不带哨兵,需要每次都判断数组是否越界int Search_Seq(SSTable ST,ElemType key){ int i; for(i=0;i<ST.TableLen &a原创 2021-08-16 15:05:20 · 87 阅读 · 0 评论 -
王道第二章线性表习题
P17综合应用题bool DeleteMin(SqList &L,ElemType &min){ if(L.length==0){ printf("顺序表为空\n"); return false; } else{ //先找到最小元素的位置 min=L.data[0]; int index=0;//最小元素在数组中的下标 for(int i=1;i<L.leng原创 2021-08-06 17:25:36 · 163 阅读 · 0 评论 -
平衡二叉树AVL
平衡二叉树右旋操作左旋操作左平衡旋转处理右平衡旋转处理平衡二叉树的插入完整测试代码测试结果右旋操作//对以p为根的二叉排序树作右旋处理//处理之后p指向新的树根结点,即旋转处理之前的左子树的根节点void R_Rotate(BiTree &p){ BiTree L; L=p->lchild;//L指向p的左子树的根节点 p->lchild=L->rchild;//L的右子树挂接为p的左子树 L->rchild=p; p=L;//原创 2021-08-02 23:41:57 · 116 阅读 · 0 评论 -
二叉排序树
二叉排序树查找非递归递归插入二叉排序树的构造中序遍历删除完整测试代码测试样例查找非递归左子树结点值 < 根节点值 < 右子树结点值若树非空,目标值与根节点的值比较,相等则查找成功若小于根节点,则在左子树上查找否则在右子树上查找。查找成功,返回结点指针;查找失败返回NULL//二叉排序树的非递归查找值为key的结点//最坏空间复杂度为O(1)BiTNode *BSTSearchNonR(BiTree T, int key){ while(T != NULL &原创 2021-08-02 18:54:42 · 273 阅读 · 0 评论 -
森林的先序和中序遍历
森林的先序和中序遍历先序遍历中序遍历最靠谱的方法先序遍历中序遍历最靠谱的方法把森林转为二叉树,左孩子,右兄弟的那种然后对二叉树进行先序或中序遍历即得正确结果。原创 2021-08-02 15:33:32 · 14214 阅读 · 2 评论 -
后序线索二叉树
后序线索二叉树后序线索二叉树的构造三叉链表结构PostThreadCreatePostThread后序线索二叉树的遍历FirstnodeNextnode完整测试代码c++测试样例1测试样例2后序线索二叉树的构造三叉链表结构结构体要用三叉链表,因为在遍历中序线索二叉树的时候需要找到某个节点的后继结点,对于右孩子来讲,其后继结点即为它的双亲,所以需要找到其双亲结点,故要用三叉链表bool CreateThreadTree(ThreadTree &T, ThreadTree parent)树的创原创 2021-08-02 14:58:00 · 7134 阅读 · 0 评论 -
先序线索二叉树
参照 中序线索二叉树整体思路和中序线索二叉树差不多只是在先序线索void PreThread(ThreadTree &p,ThreadTree &pre)要注意添加tag的判断,不然可能会出现死循环 if(p->ltag != 1)//@@@ 这里因为p->lchild可能是p的前驱结点,//如果不判断ltag,则会死循环, PreThread(p->lchild,pre);//递归,线索化左子树 if(p->rtag != 1)//@@@原创 2021-08-02 11:19:34 · 1806 阅读 · 2 评论 -
中序线索二叉树
线索二叉树线索二叉树的基本概念中序线索二叉树的构造中序线索二叉树的遍历线索二叉树的基本概念中序线索二叉树的构造中序线索二叉树的遍历原创 2021-08-02 09:57:24 · 3305 阅读 · 0 评论 -
二叉树的层次遍历c++
层次遍历算法层次遍历代码完整测试代码算法借助一个队列,先将二叉树根节点入队列,然后出队列,访问出队结点。若出队结点有左子树,则将左子树根结点入队;若出队结点有右子树,则将右子树根节点入队。然后出队,访问出队结点,重复 2,直至队列为空层次遍历代码void LevelOrder(BiTree T){ LinkQueue Q; InitQueue(Q); BiTree p=T; EnQueue(Q,p); while(!IsEmpty(Q)){原创 2021-08-01 21:49:56 · 784 阅读 · 0 评论 -
二叉树的非递归遍历(前中后)c++
非递归遍历[前中后]前序非递归中序非递归后序非递归完整代码测试前序非递归1.结点不空则先访问后入栈,而后沿着此结点的左孩子,依次访问后并入栈,直到左孩子为空//说明左子树的根已经访问结束2.栈顶元素出栈并访问右孩子,若右孩子为空,则继续执行2 ;若右孩子不空,则继续执行1 ;void PreOrderNonR(BiTree T){ LinkStack S; InitStack(S); BiTree p=T;//初始化栈,p是遍历指针 while(p || !St原创 2021-08-01 21:04:35 · 265 阅读 · 0 评论 -
二叉树的递归遍历和销毁c++
二叉树的遍历和销毁二叉树的建立二叉树的遍历:前序,中序,后序二叉树的销毁(后序)#include<stdio.h>#include<stdlib.h>#define ElemType chartypedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;void visit(BiTree T,int level){ print原创 2021-08-01 18:09:45 · 3739 阅读 · 1 评论 -
树的存储结构
树的存储结构双亲表示法孩子表示法孩子兄弟表示法(最常使用)双亲表示法//1.双亲表示法,顺序存储//每个结点中保存指向双亲的指针//根节点固定存储在0,-1表示没有双亲#define MAX_TREE_SIZE 100//树中最多结点数typedef struct{//树的结点定义 ElemType data;//数据元素 int parent;//双亲位置域}PTNode;typedef struct{//树的类型定义 PTNode nodes[MAX_TREE_原创 2021-08-01 16:40:52 · 82 阅读 · 0 评论 -
二叉树的存储结构
二叉树的存储结构顺序存储完全二叉树的顺序存储一般二叉树的顺序存储链式存储顺序存储完全二叉树的顺序存储可以让第一个位置空缺,保证数组下标和接地那编号一致初始化时所有结点标记为空#define ElemType int //顺序存储结构#define MaxSize 100struct TreeNode{ ElemType value;//结点中的数据元素 bool isEmpty;//结点是否为空};/*定义一个长度为MaxSize的数组t,按照从上至下,从左至右的顺序依原创 2021-08-01 16:05:02 · 173 阅读 · 0 评论 -
KMP算法
KMP预备知识字符串的前缀,后缀和部分匹配值手算过程:KMP算法的实现KMP算法的进一步优化预备知识字符串的前缀,后缀和部分匹配值前缀:指除最后一个字符以外,字符串的所有头部子串。后缀:指除了第一个字符外,字符串的所有尾部子串。部分匹配值:则为字符串的前缀和后缀的最长相等前后缀长度。以 ababa 为例说明'a’的前后缀均为空集,最长相等前后缀长度为0'ab’的前缀为{a}, 后缀为{b},{a}∩{b}=∅,最长相等前后缀长度为0'aba’的前缀为{a,ab}, 后缀为{ba,a},原创 2021-08-01 15:13:11 · 420 阅读 · 0 评论 -
朴素模式匹配算法
朴素模式匹配算法算法:当主串中与模式串长度相同的子串搞出来,挨个与模式串对比(即子串的第一个字符在主串中的位置为 k , 而i,j 用来移动对比 )当子串与模式串某个对应字符不匹配时,就立即放弃当前子串, 转而检索下一个子串(即k++; i=k; j=1;)详情见如下代码中的 Index函数模式串:想尝试在主串中找到相同的串,但未必在主串中存在子串:一定是在主串中存在的才叫子串#include<stdio.h>#include<stdlib.h>#incl原创 2021-08-01 08:58:37 · 402 阅读 · 0 评论 -
串的基本操作
串的动态分配,要使用malloc, 按串长分配存储区,ch指向串的基地址,那其实还是连续分配。而且在使用结束后还需要手动free串的动态分配(堆分配)typedef struct{ char *ch;//按串长分配存储区,ch指向串的基地址 int length;//串的长度}HString;HString s;s.ch=(char*)malloc(sizeof(char));//用完需要手动frees.length=0;下面是使用静态分配来实现串的基本操作:#includ原创 2021-08-01 00:11:46 · 305 阅读 · 0 评论 -
中缀表达式求值
先将中缀转后缀再用后缀求值以下程序中用到全局变量 字符串mys,和长度L来实现记录中缀转为后缀的表达式。中缀转后缀 和 后缀求值可以参考前两篇文章这里的求值只能针对具体的数字,如果中缀表达式中有未知变量形如a,b,c则无法计算结果//中缀表达式转后缀表达式/* 算法步骤:初始化一个栈,用于保存暂时还不能确定运算顺序的运算符从左到右处理各个元素,直到末尾,可能遇到三种情况:4. 遇到操作数,直接加入后缀表达式5. 遇到界限符,遇到左括号则直接入栈,遇到右括号则依次弹出栈内运算符并加.原创 2021-07-31 21:36:03 · 1120 阅读 · 0 评论 -
后缀表达式求值
后缀表达式的求值顺序扫描表达式中的每一项若为操作数,则压入栈中;若为运算符则连续从栈中pop出两个操作数,Y和X(后出栈op先出栈),并将计算结果重新压入栈中。当表达式的所有项都扫描并处理完后,栈顶存放的就是最后的计算结果//后缀表达式的计算/*顺序扫描表达式中的每一项若为操作数,则压入栈中;若为运算符则连续从栈中pop出两个操作数,Y和X(后出栈op先出栈),并将计算结果重新压入栈中。当表达式的所有项都扫描并处理完后,栈顶存放的就是最后的计算结果*///栈的顺序存原创 2021-07-31 21:35:47 · 1128 阅读 · 0 评论 -
中缀表达式转后缀表达式
算法步骤:初始化一个栈,用于保存暂时还不能确定运算顺序的运算符从左到右处理各个元素,直到末尾,可能遇到三种情况:遇到操作数,直接加入后缀表达式遇到界限符,遇到左括号则直接入栈,遇到右括号则依次弹出栈内运算符并加入后缀表达式,直到弹出左括号为止。注意左括号不加入后缀表达式遇到运算符,依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到了左括号或栈空则停止,之后再把当前运算符入栈编写程序过程中,扫描到运算符的时候,判断栈中优先级高于当前运算符的情况,注意用GetTop来代原创 2021-07-31 18:17:15 · 123 阅读 · 0 评论 -
栈在括号匹配中的应用
算法思路:依次遍历所给的字符串,遇到左括号就入栈遇到非左括号则先检查栈是否为空若为空栈,则return false;若栈不为空,则弹出栈顶元素,看和所遍历到的字符是否相匹配;匹配:则遍历下一个字符,不匹配则return false;最后都匹配结束后还应检查栈是否为空。王道截图://栈的顺序存储结构,用静态数组实现#include<stdio.h>#include<string.h>#define MaxSize 20//定义栈中元素的最大个数#define原创 2021-07-31 14:59:29 · 346 阅读 · 0 评论 -
队列的基本操作
队列队列的顺序存储循环队列队列的链式存储队列的顺序存储//队列的顺序存储//附设两个指针,队头指针front指向队头元素,//队尾指针指向队尾元素的下一个位置。#include<stdio.h>#define MaxSize 20//定义队列中元素的最大个数//附设两个指针,队头指针front指向队头元素,//队尾指针指向队尾元素的下一个位置。typedef struct{ int data[MaxSize];//存放队列元素 int front,rear;原创 2021-07-31 14:15:01 · 127 阅读 · 0 评论 -
栈的链式存储结构和基本操作
采用链式存储的栈称为链栈,优点是便于多个栈共享存储空间和提高效率,且不存在栈满上溢的情况。通常用单链表实现,并规定所有操作都是在单链表的表头进行的。这里规定链栈没有头结点。采用链式存储结构便于结点的插入与删除,链栈的操作和链表类似,入栈和出栈的操作都是链表的表头进行。//栈的链式存储结构#include<stdio.h>#include<stdlib.h>typedef struct LSNode{ int data;//数据域 struct LSNod原创 2021-07-31 11:45:46 · 1272 阅读 · 1 评论 -
顺序栈的实现c++
顺序栈的实现,利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针top指示当前栈顶元素的位置。销毁栈时,置 i=-1,即可,余下的待运行结束后由系统自动回收。//栈的顺序存储结构,用静态数组实现#include<stdio.h>#define MaxSize 20//定义栈中元素的最大个数typedef struct{ int data[MaxSize];//存放栈中的元素 int top;//栈顶指针}SqStack;//顺序栈void In原创 2021-07-31 11:03:12 · 201 阅读 · 0 评论 -
静态链表(c++)
静态链表应用场景:1.不支持指针的低级语言2.数据元素数量固定不变的常量(例如操作系统中的文件分配表FAT)优点:增删操作无需移动大量元素缺点:不能随机存取,只能从头结点开始依次往后查找,容量固定不变。//静态链表:用数组的方式实现的链表//设数组下标为0的位置为头结点#define MaxSize 20#include<stdio.h>typedef struct{ int data; int next;}SLinkList[MaxSize];/*等价于原创 2021-07-31 10:25:07 · 534 阅读 · 1 评论 -
循环链表(c++)
这里写目录标题循环单链表插入,删除遍历循环双链表循环单链表插入,删除循环单链表的插入,删除算法与单链表几乎一样,不同的是若操作是在表尾进行,则执行的操作不同,以让单链表继续保持循环的性质。当然,因为循环单链表是一个换,因此在任何一个位置上的插入和删除操作都是等价的,无需判断是否是表尾遍历在单链表中只能从表头结点开始往后顺序遍历整个链表,而循环单链表可以从表中的任意一个结点开始遍历整个链表,有时对单链表常做的操作是在表头和表尾进行的,此时对循环单链表不设头指针,而仅设尾指针,从而使操作效率更高。因原创 2021-07-31 08:48:26 · 467 阅读 · 0 评论 -
双向链表的基本操作(c++)
双向链表的实现基本操作bool InitDLinkList(DLinkList &L);bool Empty(DLinkList L);bool InsertNextDNode(DNode *p, int e);//在p结点之后插入s节点//后插操作bool DeleteNextDNode(DNode *p);//删除p结点的后继结点void DestroyDList(DLinkList &L);//销毁一个双向链表bool PrintDList(DLinkList L);/原创 2021-07-31 08:22:32 · 355 阅读 · 0 评论 -
线性表的链式表示(单链表)c++
注意销毁链表时,要一个一个地free ( p )下面各个函数均测试过可以正常运行LinkList HeadInsert(LinkList &L);//头插法建立单链表LinkList TailInsert(LinkList &L);//尾插法建立单链表bool InitList(LinkList &L);//初始化单链表bool Empty(LinkList L);//判空int Length(LinkList L);//求表长bool ListInsert(LinkL原创 2021-07-30 23:33:28 · 220 阅读 · 0 评论 -
线性表的顺序表示(动态分配一维数组)
动态分配动态分配一位数组,存储数组的空间在程序执行过程中通过动态存储分配语句分配的,一旦数据空间占满,就另外开辟一块更大的存储空间,用以替换原来的存储空间,从而达到扩充存储数组空间的目的,而不需要为线性表一次性地划分所有空间。大致上都与静态分配一致,只有以下几点不同1)结构体中换为指示冬天分配数组的指针2)数组的最大容量可以扩充3)初始化要用malloc4) 扩充时要新写一个扩充函数IncreaseList扩充函数即重新分配一块空间,将原来的内容复制过来,然后释放原来的空间。5) Destr原创 2021-07-30 19:36:52 · 279 阅读 · 0 评论 -
线性表的顺序表示(静态分配一维数组)
顺序表-静态顺序表的定义结构体的使用访问结构体成员结构体变量的初始化静态顺序表的增删查改顺序表的定义涉及结构体的使用和顺序表的增删查改结构体的使用1.结构体变量的定义可以放在结构体的声明之后struct 结构体名{ 成员列表;};struct Student{ char name[20]; int num; float score;};//结构体的声明//定义结构体变量struct Student stu1;2.在声明结构体时定义结构体变量struct Student{原创 2021-07-28 17:43:37 · 318 阅读 · 0 评论