
C++笔记
。✧* ꧁流痕꧂✧*。
When you reach for the stars you may not quite get one, but you won't come up with a handful of mud either.
展开
-
排序
文章目录基本概念稳定性关键操作内排序和外排序排序审判选择法插入排序冒泡排序希尔排序快速排序归并排序基本概念排序目的:将一组数据无序变有序数学定义:排序数学定义:假设含n个数据元素的序列为{ R1, R2, …, Rn} 其相应的关键字序列为{ K1, K2, …, Kn}这些关键字相互之间可以进行比较,即在它们之间存在着这样一个关系 :Kp1≤Kp2≤…≤Kpn;按此固有关系将上式记录序列重新排列为{ Rp1, Rp2, …,Rpn}的操作称作排序稳定性如果在序列中有两个数据元素r[i]和r[j原创 2021-10-15 22:17:06 · 105 阅读 · 0 评论 -
霍夫曼树
文章目录定义路径路径长度结点的权结点带权路径的长度WPL概念准则举例定义路径树中一个结点往下可以达到孩子或孙子的通路路径长度通路中分支数目结点的权树的结点赋有的特殊的数值结点带权路径的长度WPL根节点到该结点的路径长度与该结点的权的乘积概念霍夫曼树是一种特殊的二叉树,是一种带权路径长度最短的二叉树,又称为最优二叉树。 给定 N 个权值作为二叉树的 N 个叶节点的权值,构造一棵二叉树,若该二叉树的带权路径长度达到最小,则称该二叉树为霍夫曼树。即WPL最小压缩算法的基础作用:编码压缩原创 2021-10-10 00:11:05 · 193 阅读 · 0 评论 -
二叉线索树
文章目录概念代码概念普通二叉树 只能找到结点 左右孩子信息 该结点的直接前驱和直接后继只能在遍历过程中获得若可将遍历后对应的有关前驱和后继预存 则从第一个结点开始 便可遍历整个树运用叶子结点的悬空指针可规定:若结点有左子树 则lchild指向其左孩子否则 lchild指向其直接前驱(即线索)若结点有右子树 则rchild指向其右孩子 否则rchild指向其直接后继(即线索)代码void InThreading(BithrTree p){ if(p) {原创 2021-10-08 23:49:52 · 114 阅读 · 0 评论 -
树--#法
确定树1.通过中序遍历和先序遍历可以确定一棵树2.通过中序遍历和后序遍历可以确定一棵树算法1.通过先序遍历找到根节点A 根据A再在中序遍历中找到左子树和右子树2.先序遍历在A的左子树中找到左子树的根节点,转步骤13.先序遍历在A的右子树中找到右子树的根节点,转步骤1#法创建树BiTNode* CreateBiThrTree(BiTNode *T){ BiTNode *node = NULL; BiTNode *pL = NULL; BiTNode *pR = NU原创 2021-10-07 23:41:37 · 95 阅读 · 0 评论 -
树 中序遍历非递归算法
文章目录算法代码算法左子树为空或者左子树已经访问完毕后,再访问根 访问根完毕后 再访问右子树栈结构 符合先入后出步骤一:结点有左子树 结点入栈;结点没有左子树 访问该结点步骤二:结点有右子树 重复步骤一;结点没有右子树 结点访问完毕 根据栈顶指示回退 访问栈顶元素 并 访问右子树重复步骤一栈为空则遍历结束结点入栈表明 本身没被访问 自身的右子树也没有被访问代码typedef struct BiTNode* BiTree;void inOrder(BiTNode * root){原创 2021-10-06 23:40:49 · 287 阅读 · 0 评论 -
树的三种基本操作
文章目录求叶子结点的数目copy二叉树求树的深度求叶子结点的数目用任何一种递归算法 凡是左右指针均为空的 是叶子 统计数目即可int sum=0;void countLeaf(BiTNode *T,int *sum){ if(!T) { if(!T->lchild && !T->rchild) { (*sum)++; //指针指向的数据+1 } if(T->原创 2021-10-05 22:58:07 · 173 阅读 · 0 评论 -
三叉链表及树的遍历
文章目录树的三叉链表双亲链表二叉树遍历树的三叉链表元素:lchild data rchild parenttypedef struct TriTNode{ int data; //左右孩子指针 struct TriTNode *lchild, *rchild; struct TriTnode *parent;}TriTNode,*TriTree;双亲链表两个结构表示一个树typedef struct BPTNode{ int data;原创 2021-10-04 22:46:38 · 4308 阅读 · 0 评论 -
二叉树(二叉链表)
定义n个结点的有限集合 由一个根节点以及两棵互不相交的 分别称为左子树 和 右子树的二叉树组成逻辑结构一对二基本特征每个结点最多只有两棵子树(不存在大于2的结点)左子树和右子树次序不能颠倒基本形态性质1) 二叉树的第i层上 至多有2的i-1次方个结点2)深度为K的二叉树至多有2的K次方-1个结点3)对于二叉树 2度的结点数有n个 则叶子有n+1个4)具有n个结点的完全二叉树 其深度必为以二为底n的对数+15) 对完全二叉树 从上到下 从左到右 编号 则编号为i的结点 其左孩子编号原创 2021-10-03 23:55:15 · 1107 阅读 · 0 评论 -
链式存储复习及树
动态链表操作无名结构体变量typedef struct LinkListNode{ struct LinkLinkNode* next;}LinkListNode;typedef struct LinkList{ LinkListNode header; int length;}LinkList;LinkList* LinkList_Create(){ LinkList *ret = NULL:ret = (LinkList*)malloc(size原创 2021-10-02 23:58:07 · 106 阅读 · 0 评论 -
线性表复习及队列的链式存储
文章目录线性表回顾队列线性表回顾相同类型 数据有限排列可逐项访问 顺序存储#define MAXSIZE 50typedef struct LIST{ int data[MAXSIZE];//数组 int length;}List;//初始化 建立一个新的线性表void ListInit(List* L){ L->length = 0; memeset(L->data,0,sizeof(L->data));}//线性表是否为空int Li原创 2021-10-01 23:56:37 · 108 阅读 · 0 评论 -
队列的链式存储
主函数void main(){ int i,a[10]; LinkQueue *queue = NULL; queue = LinkQueue_Create(); if(queue ==NULL) { return; } //添加元素 for(i=0;i<5;i++) { a[i]=i+1; LinkQueue_Appecd(queue,&a[i]); } //求队列的属性 cout<<LinkQueue_Len原创 2021-09-30 22:48:23 · 80 阅读 · 0 评论 -
队列(Queue)的顺序存储
基本概念队列是一种特殊的线性表在线性表的两端进行操作队头(Front):取出数据元素的一端队尾(Rear): 插入数据元素的一端即:队列是只允许在一端进行插入操作 而在另一端进行删除操作的线性表常用操作销毁队列清空队列进队列出队列获取队头元素获取队列长度SeqQueue* SeqQueue_Create(int capacity);void SeqQueue_Destroy(SeqQueue* queue);void SeqQueue_Clear(SeqQueue* qu原创 2021-09-29 23:45:39 · 306 阅读 · 0 评论 -
栈 -- 中缀转后缀
中缀转后缀中缀表达式适应人的阅读和思维习惯后缀表达式符合计算机的运算习惯算法数字:直接输出符号:左括号 进栈运算符号:与栈顶符号进行优先级比较 若栈顶符号优先级低 该符号进栈 若栈顶符号优先级不低 将栈顶符号弹出并输出 之后进栈右括号:将栈顶符号弹出并输出 直到匹配左括号遍历结束:栈中所有符号弹出并输出计算机基于后缀表达式的计算算法:遍历后缀表达式的数字和符号对数字: 直接进栈对符号:从栈中弹出右操作数从栈中弹出左操作数根据符号运算将运算结果压入栈中遍历结束:栈中的唯原创 2021-09-28 23:32:06 · 99 阅读 · 0 评论 -
栈的应用
就近匹配几乎所有编译器都具有检测括号是否匹配的能力实现编译器中的符号成对检测eg:检测#include <stdio.h> int main(){int a[4][4];int (*p)[4];p=a[0];return 0;算法思路从第一个字符开始检测当遇到普通字符时忽略遇到左符号时压入栈中遇到右符号时从栈中弹出栈顶符号 并进行匹配匹配成功 继续读入下一个字符匹配失败 立即停止 并报错结束:成功 :所有字符扫描完毕 且栈为空结束 : 匹配失败或所有字符扫描完毕但栈原创 2021-09-27 23:45:34 · 81 阅读 · 0 评论 -
栈的链式存储
文章目录链表模拟栈设计与实现链表模拟栈设计与实现//头文件#ifndef_MY_LINKSTACK_H_#define _MY_LINKSTACK_H_typedef void LinkStack;LinkStack* LinkStack_Create();void LinkStack_Destroy(LinkStack* stack);void LinkStack_Clear(LinkStack* stack);int LinkStack_Push(LinkStack* st原创 2021-09-26 23:30:49 · 101 阅读 · 0 评论 -
栈的顺序存储
文章目录线性表模拟栈调用实现线性表模拟栈栈是一类特殊的线性表,则可以用线性表模拟栈//引入线性表 的 头文件 间接实现栈的顺序存储#include "seqstack.h"#include "seqlist.h"//创建栈 == 创建线性表 SeqStack* SeqStack_Create(int capacity){ return SeqList_Create(capacity);}//销毁栈==销毁线性表void SeqStack_Destroy(SeqStack* st原创 2021-09-25 23:56:49 · 94 阅读 · 0 评论 -
栈 stack
基本概念一类特殊的线性表 仅能在一端进行操作栈顶(Top):允许操作的一端栈底(Bottom):不允许操作的一端有线性(前驱后继)关系栈底固定 先进栈的在栈底操作创建栈 销毁栈 清空栈 进栈(也叫入栈 压栈) 出栈 获取栈顶元素 获取栈的大小#ifndef _MY_STACK_H_#define _MY_STACK_H_typedef void Stack;Stack* Stack_Create();void Stack_Destroy(Stack* stack);vo原创 2021-09-24 23:44:28 · 89 阅读 · 0 评论 -
双向链表函数
头文件typedef void DLinkListtypedef struct_tag_DLinkListNode{ struct _tag_DLinkListNode* next; struct _tag_DLinkListNode* pre;}DLinkListNode;DLinkList* DLinkList_Create();void DLinkList_Destroy(DLinkList* list);void DLinkList_Clear(DLinkList*原创 2021-09-23 23:11:14 · 106 阅读 · 0 评论 -
循环链表函数及双向链表
循环链表删除结点CircleListNode* CircleList_Delete(CircleList* list,int pos){ TCircleList* sList = (TCircleList*)list; int i=0; if(sList !=NULL)&&(pos>=0)&&(sList ->length >0)) { CircleListNode* current =(CircleListNode*原创 2021-09-22 23:38:23 · 115 阅读 · 0 评论 -
循环链表
文章目录基本概念新增功能游标重置获取当前游标指向的数据元素游标移动指向下一个数据元素指定删除链表的某个数据元素特点循环链表插入结点头插法尾插循环链表删除结点基本概念循环链表的定义:将单链表的最后一个数据元素的next指针指向第一个元素循环链表拥有单链表的所有操作创建链表销毁链表获取链表长度清空链表获取第pos个元素操作插入元素到位置pos删除位置pos处的元素新增功能游标即在循环链表中可以定义一个“当前”指针,这个指针通常称为游标,可以通过这个游标遍历链表中所有的元素游标重置原创 2021-09-21 23:28:45 · 160 阅读 · 0 评论 -
单向链表的设计实现
文章目录要素运算符结构图分类静态链表动态链表动态链表的建立动态链表的插入动态链表的删除动态链表的输出主函数调用实现要素1.结构体变量2.指向结构体变量的指针运算符-> :指向运算符eg:p->成员名 即 (*p).成员名即三种形式等价:结构体变量.成员名 <=> (*p).成员名 <=> p->成员名new delete运算符(相对于C语言中的malloc free函数,new delete作为运算符执行效率更高)动态分配撤销存储空间格式:n原创 2021-09-20 23:05:39 · 259 阅读 · 1 评论 -
线性表设计与实现
文章目录线性表定义数学定义性质线性表操作线性表的顺序存储结构插入元素算法获取元素算法删除元素算法特点线性表的链式存储结构表头节点数据节点尾结点链表领域技术推演传统链表Linux内核链表企业通用链表分类单链表双链表循环链表特点线性表定义有顺序且有限的相同类型的数据元素的集合eg:星座列表星座通常以白羊座开始 双鱼座结尾 星座都有前驱后继 一共有十二个数学定义线性表是具有相同类型的n个数据元素的有限序列a1 a2 ·······anai 是表项 n是表长度性质a0为线性表第一个元素 只有原创 2021-09-19 23:53:00 · 740 阅读 · 0 评论 -
C++数据结构与算法 基本概念
文章目录数据结构数据逻辑结构集合线性结构树形结构图状结构数据物理结构顺序链式索引散列(hash)哈希函数直接寻址法数字分析法平方取中法取随机数法除留取余法算法特性输入输出有穷性确定性可行性效率度量事前分析事后分析大O表示法算法与数据结构联系数据结构数据逻辑结构逻辑关系层面的数据,与存储无关算法设计集合线性结构一对一 如线性表、栈、队列树形结构一对多 如树图状结构多对多数据物理结构即存储结构,是数据的逻辑结构在计算机存储器的映像算法实现顺序存储器的相对位置 表示 逻辑关系集原创 2021-09-18 08:43:48 · 237 阅读 · 0 评论