![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 83
学习笔记
魔幻音
如果世界上真的有奇迹,那只是努力的另一个代名词。
展开
-
二叉树生成
此次编程目的是将A(B(D(F,G),J(,L(K))),C(E(H,I)))基于这种二叉树表达形式,根据所给生成二叉树首先是每个节点的存储类型:typedef struct B_TREE { int data; struct B_TREE *left; struct B_TREE *right;}B_TREE;每个节点由该点数据和其左右孩子意识到这种操作实际和表达式获取数据是类似的,在遇字符后改为指定状态进行操作,此时可以用上状态变迁图此时不进行括号失配等特殊问题的考虑,状态变迁图先原创 2020-08-10 17:17:19 · 1485 阅读 · 0 评论 -
串匹配KMP算法基础:NEXT数组 以及KMP算法
对于串匹配问题,最基础的做法是分别遍历源字符串和目标字符串,当失配时,源字符串前进一位,目标字符串归0位。int searchString(const char *src, const char *sub) { int srcLen = strlen(src); int subLen = strlen(sub); int srcIndex = 0; int subIndex = 0; for (; srcIndex < srcLen - subLen + 1; srcIndex++) {原创 2020-08-10 17:29:44 · 184 阅读 · 0 评论 -
稀疏矩阵及其转置
系数矩阵的存储方式:三元组typedef struct TRIPLE_ELEMENT { int data; int row; int col;}TRIPLE_ELEMENT;三元组用于存储矩阵的每一个元素额外需要一个表头来表示整个矩阵:typedef struct TRIPLE_MATRIX { TRIPLE_ELEMENT *elementList; int maxRow; int maxCol; int elementCount;}TRIPLE_MATRIX;初始化及输原创 2020-08-03 19:24:07 · 922 阅读 · 0 评论 -
三种改良排序(希尔排序,堆排序,快速排序)
一:改良的直接插入排序(希尔排序)优化考虑:因为直接插入排序对于大致有顺序的数列效率较高,希尔排序即将数列先进行一定排序希尔:for (step = count/2; step; step /= 2) { for (start = 0; start < step; start++) { shellOneSort(data, count, start, step); } }一次:for (i = start + step; i < count; i += step) {原创 2020-07-29 18:47:21 · 655 阅读 · 0 评论 -
二叉树的遍历 及 树的杂项
一:二叉树的广度遍历广度遍历用队列思想;队列:先进先出,队尾入队,队首出队首先根节点入队while(队列非空) {队首节点出队;队首节点的子节点入队;}广度遍历表面使树从上到下,从左到右遍历优先按行遍历二:二叉树的深度遍历深度遍历用堆栈思想;堆栈:先进后出,栈顶进,栈顶出首先根节点入栈while(堆栈非空){栈顶出栈;栈顶节点的子节点入栈;}深度遍历表面从左到右,从上到下遍历优先向深处遍历...原创 2020-07-29 17:31:12 · 95 阅读 · 0 评论 -
三种基本排序(直接插入,直接选择,直接交换)
一:直接选择排序将一串数分成两部分,前部分是已经排序好的,后部分是未排序的。开始将第一个数作为已排序的第一个数,未排序数在已排序中找插入的位置即完成排序。for (i = 1; i < count; i++) { tmp = data[i]; for (j = 0; j < i && tmp >= data[j]; j++) { } for (t = i; t > j; t--) { data[t] = data[t - 1]; }原创 2020-07-29 12:23:25 · 2951 阅读 · 1 评论 -
表达式基础 获取数字
关于数字的获取,首先要知道数字可以以什么形式存在:引入状态变迁图:由此,数值的获取就有了基本眉目,根据不同的状态作出不同的应对对于数据存放,采取分部 用结构体typedef struct { int index; //字符串所读取到的位置 boolean ok; //是否正确 boolean finished; //是否结束 int status; //当前状态 double value; //值 double dec; //小数部分值 int sign; //正原创 2020-07-22 18:48:08 · 155 阅读 · 0 评论 -
文件编程
文件编程函数:文件打开:FILE *fopen (const char *文件路径, const char *操作方式);注: 操作方式:第一部分:r(只读)、w(创建/写)、a(追加)、r+(读+写)第二部分:t(文本文件)、b(二进制文件)其中 若以r打开不存在的文件,将返回NULL,即失败若以w打开文件,两种情况 ①文件存在,清空该文件 ②文件不存在,创建一个空文件文件关闭:void fclose(FILE *fp);文件写:fprintf(FILE *fp, const char *f原创 2020-07-20 13:40:29 · 187 阅读 · 0 评论 -
位运算总结(基础运算符、位运算技巧、清位、取位)
位运算运算符:注:位运算基于补码1.按位取反 ~ (1 0互换)2.按位与 & (和&&同理)3.按位或 | (和||同理)4.按位异或 ^ (不同为1,相同为0)5.右移 >> (右位消失,左侧补符号位或0)6.左移 << (左位消失,右侧补0)位运算技巧:1.关于&取二进制某位上的数:例如取后三位,将Num & 111原理:因为num & 1 = 本身,原创 2020-07-20 13:01:32 · 1105 阅读 · 0 评论 -
基于线性表,实现多项式加法
当着手于多项式加法的实现,线性表就成为了实现目标的工具,要对工具进行保护,实际就是对工具进行一次封装,例如:void destoryPoly(POLY **head) { return destoryLinear(head);}实际destoryPoly和destoryLinear是相同的,表面只是重新给个名字,在实际程序中,线性表作为最基础的工具,我们用.o来保护,只给一个.h来提示可用的函数。在多项式实现中,LINEAR原本表示控制头,指向线性表, 实际问题中,POLY表示控制头,指向多项式原创 2020-07-19 18:01:48 · 688 阅读 · 0 评论 -
线性表
线性表类型定义:typedef struct LINEAR{ USER_TYPE *data; int capacity; int count; EQU_FUN equals;}LINEAR;USER_TYPE为想要使用线性表时所要存储的数据类型。该结构体说明线性表是由一个表头指向一个数组来存储,管理数据。capacity表示线性表所能储存的数据量,count表示已经存储进去的数据量;equals表示用于比较的函数,初始的比较函数用的是切片比较:static boolean def原创 2020-07-19 12:52:33 · 186 阅读 · 0 评论 -
带头节点链表总结
带头节点链表的创建:初始化一个头结点(包含指向下一个节点的POINT *next),执行初始化前判断这个链表是否是空链表if(NULL == head) { return FALSE; }主要部分:if(NULL == head->next) { head->next = p; //若头结点指向为空,则当前节点为第一个节点 } else { tail->next = p; //头结点不为空,应在末尾追加节点 } num++; tail = p;原创 2020-07-17 12:03:08 · 366 阅读 · 0 评论