● 数据结构
LinJie98
开源 分享 快乐
展开
-
数据结构与算法的思考与历程
数据结构与算法的思考与历程原创 2020-05-14 17:06:53 · 2055 阅读 · 0 评论 -
双向循环链表--增删查操作
双向循环链表与单链表区别其实不多,对比之后就是多了几个操作步骤#include <stdio.h>#include <malloc.h>typedef int Elemtype;typedef struct LNode{ Elemtype data; struct LNode *prior; struct LNode *next;}LNode,*LinkList;L原创 2017-09-29 21:31:47 · 618 阅读 · 0 评论 -
单链表(不含头结点)--尾插,查找
#include <stdio.h> typedef struct Node { int data; struct Node *next; }LNode, *LinkList; void create_list_rear(LinkList *head,int n)//尾插法 { int i; Li原创 2017-09-29 21:53:24 · 1010 阅读 · 0 评论 -
单链表逆置代码解析
#include <stdio.h>#include <malloc.h>typedef struct LNode{ int data; struct LNode *next;}LNode,*Linklist;Linklist Insertlist_last(Linklist head)//尾插{ Linklist p; Linklist q; i原创 2017-10-08 21:27:58 · 3814 阅读 · 3 评论 -
链表中p->next=head->next;语句解析
在看到一些书上或者网上写的不管是单链表还是双向循环链表等,都会有p->next=q->next;或者p-next=head->next; 这里q是尾指针,head是头指针,p是指向新建结点的指针该语句作用 这条语句的作用其实就是给新建结点找到它该有的位置该语句在单链表下的头插法是必须存在的,而在双向循环下可有可无1.单链表的头插法下p-next=head->next;LinkLis原创 2017-09-30 16:20:31 · 32906 阅读 · 1 评论 -
串操作——定长顺序存储,堆分配存储,模式匹配(KMP)
一、串基本操作——定长顺序存储类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列,该结构,按预定义的大小,为每个定义的串变量分配一个固定长度的存储区#include <stdio.h>#include <malloc.h>int getLength(char *str){ int len=0; while(str[len]!='\0') {原创 2017-10-27 16:16:41 · 6088 阅读 · 0 评论 -
队列详解——循环队列(顺序结构),链队列,循环队列(只有尾指针),字符队列(顺序结构)
准备写队列以下几种类型:循环队列(顺序结构),链队列,循环队列(只有尾指针),字符队列(顺序结构)一、循环队列循环队列存储结构typedef int QElemType;typedef struct{ QElemType *base; int front; int rear;}SqQueue;实现循环语句 可以把循环队列想象成一个圈 因为循环队列假如是数据能占所原创 2017-10-20 18:30:45 · 5026 阅读 · 0 评论 -
二叉树基本概念——二叉树(概念、性质、顺序存储,链式存储)、满二叉树与完全二叉树、二叉链表,三叉链表,双亲链表
一、二叉树定义 二叉树的特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒下面是含三个结点的二叉树(方便理解)二、二叉树性质1、在二叉树的第i层上至多有2^(i-1)个结点(i>=1):比如第1层只有一个结点(根)2、深度为k的二叉树至多有2^(k)-1个结点(k>=1)3、对任何一个二叉树T,如果其终端结点数为n0,度为2的结点数原创 2017-11-07 22:43:21 · 5571 阅读 · 0 评论 -
顺序栈与链栈基本操作
一、顺序栈后进先出 1、顺序栈是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素 2、因为顺序栈使用中所需的最大容量无法估计,所以一般初始化设空栈时,不应该限定栈的最大容量。而应该为栈分配一个基本容量,然后在应用过程中,当栈的空间不够使用再不断扩大 所以可以设两个#define,一个是初始,一个是扩大 3、注意:top指针是指向最后一个元素的下一个位置(指为原创 2017-10-12 20:21:40 · 3729 阅读 · 1 评论 -
二叉树——创建,递归遍历输出
二叉树原形:因为要知道叶子结点(来结束子树),所以需要确定叶子结点的孩子,把叶子结点的孩子记为#补充成完全二叉树(完全二叉树): 输入的时候,因为程序中是先序方法创建二叉树(当然也可以中序和后序),所以输入要按先序方法输入:ab#c##d#e##二叉树先序,中序,后序遍历输出程序如下#include <stdio.h>#include <malloc.h>typedef char TEle原创 2017-11-08 21:28:42 · 1292 阅读 · 0 评论 -
二叉树——判断两棵二叉树是否相等(先序和中序遍历序列建立二叉树)
需求:利用先序遍历序列和中序遍历序列来建立两棵二叉树,并判断是否相等需要先将创建二叉树创建的方法是将该二叉树的先序的序列和中序的序列分别存储到Pre数组和Mid数组中,它们的存储顺序如下:判断两棵树是否相等采用递归的方法,用先序,中序,后序遍历的方法对两棵树每个数据判断是否相等两棵树都为空,返回1两棵树不相等,返回0两棵树相等,返回1代码解析及代码如下:#include <stdio.h>原创 2017-11-08 21:46:29 · 9574 阅读 · 3 评论 -
二叉树——中序非递归遍历二叉树
利用栈的方法来遍历 先访问将根结点和左子树根结点压栈,然后不断访问左子树,直到NULL,再访问左子树下的右子树,遇到NULL,就出栈。大类的右子树和左子树差不多思路如下图: 代码#include <stdio.h>#include <malloc.h>typedef struct BiNode{//二叉树结点类型 char data; struct BiNode *lchil原创 2017-11-10 19:51:15 · 615 阅读 · 0 评论 -
轻松解决不同关键字序列构成的二叉排序树ASL(平均查找长度)(成功)不同问题
关键字序列1,2,3,4,5构造而得的二叉排序树 ASL=(1,2,3,4,5)/5=3按关键字3,1,2,5,4构造而得的二叉排序树 ASL=(1+2+2+3+3)/5=2.2很明显第二种序列的ASL要快。至于二叉排序树怎么构成的其实就是根据它的性质(若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值,若它的右子树不空,则右子树上的所有结点的值均大于它的根结点的值)ASL怎么原创 2017-11-28 20:39:01 · 44357 阅读 · 3 评论 -
哈夫曼树与哈夫曼编码(前缀编码)理解
一、哈夫曼树定义及用途 哈夫曼树又称最优二叉树,是带权路径长度(WPL)最短的树,可以构造最优编码,用于数据传输,数据压缩等方向下面是二叉树和哈夫曼树二、概念路径:树中一个结点到另一个结点之间的分支序列构成两个结点间的路径路径长度:路径上的分支数目树的路径长度:树根到每个结点的路径长度的和结点带权路径长度:结点到树根的路径长度与结点的权的乘积树的带权路径长度:树中所以叶子结点的带权路原创 2017-11-21 14:30:11 · 32215 阅读 · 3 评论 -
索引查找(分块查找)
索引查找思想是分块查找,它其实是顺序查找和二分查找的结合,即时间复杂度在两者之间。索引查找表两部分构成索引表存储的是各块记录中的最大关键字值和各块的其实存储地址块表中存储查找表中所有的记录并按块有序,建议用链式存储 #include <stdio.h> #include <malloc.h> typedef int keytype;原创 2017-12-01 20:29:34 · 7112 阅读 · 3 评论 -
二叉排序树转平衡二叉树
感觉写不出这位大佬这么仔细,所以转载一波,方便一起观看 https://www.cnblogs.com/xuyinghui/p/4592511.html转载 2017-12-05 14:26:12 · 5224 阅读 · 0 评论 -
哈希表
1、哈希函数关键字(key)————>记录在表中的位置,关键字到记录在表中的位置需要一个函数来确定,即f(key)哈希函数2、哈希表基本思想哈希表中的每个元素的关键字key为自变量,通过哈希函数,计算出函数值,这个值作为数组下标,将元素存入数组对应位置3、哈希表构建构造哈希函数处理异常4、构造哈希函数直接定址法数字分析法平方取中法折叠法除留余原创 2017-12-09 16:33:17 · 1388 阅读 · 0 评论 -
图基于邻接表的创建(尾插)、遍历(DFS)、最短路径(Dijkstra)
一、需求1、实现图的创建2、实现图的遍历3、实现图的最短路径求解二、解决方案1、图创建采用邻接表存储结构、和尾插法的创建模式2、图的遍历采用DFS深度优先的算法3、图的最短路径采用Dijkstra算法三、代码#include <stdio.h>#include <stdlib.h>#include &l...原创 2018-05-06 22:32:00 · 2661 阅读 · 0 评论 -
单链表--增删改查,头插尾插,清空销毁
#include <stdio.h> #include <malloc.h> #define ok 1 #define error 0 typedef int Elemtype; typedef struct LNode{ Elemtype data; struct LNode *next; }LNode,*LinkLi原创 2017-09-29 21:27:15 · 557 阅读 · 3 评论 -
顺序表增删改查两种方法---C实现
一、无返回值的增删改查(且成员elem以指针形式)#include <stdio.h>#include <malloc.h>#define list_init_size 100#define add_list 10#define ERROR 0#define OK 1typedef int Elemtype;typedef struct{ Elemtype *elem;原创 2017-09-24 18:54:47 · 2402 阅读 · 1 评论 -
数据结构线性表总章
一. 线性表的要求:1.有限且有顺序的序列。2.第一个元素只有后继无前驱,最后一个元素有前驱无后继。3.线性表中第i个元素,i称为线性表中的位序。4.在复杂线性表中,一个数据元素可以由多个数据项组成。//举个例子如数据元素是李强,他有性别,出生年月等是数据项。5.一个线性表中每个数据元素都要相同类型的。6.线性表中无元素时称为空表。二.线性表基本总操作 //一下原创 2017-01-14 22:26:43 · 523 阅读 · 0 评论 -
栈与队列(二)之逆波兰(RPN)计算器
逆波兰计算器(逆波兰也是一种不需括号的后缀表达式)(这个计算器的写法时间复杂度更加小,更有效率)(栈的思想)逆波兰(后缀表达式)(1-2)×(4+5)==1 2 - 4 5 + *一、要求——实现对逆波兰输入表达式进行计算(输入正确)——支持带小数点的数据二、正常表达式--》逆波兰表达式(这个理解需要自己总结理解,或者网上也有很多)a+b--》a b +a+(b-c)-原创 2017-02-06 21:21:26 · 1729 阅读 · 1 评论 -
浅谈递归思想(图码齐解)
一、浅谈定义 1.官方定义:把一个直接调用自己或者通过一系列调用语句间接调用自己的函数称,递归函数 2.个人归纳定义:其实函数递归就是函数不断套用自己,直到到达判定条件,然后像入栈出栈那样,出栈进行下一步条件,如果真难理解,可以不要把一个递归函数中调用自己的函数看作调用自己,而就当它是在调另一个函数,只不过和自己长的一模一样二、图码齐解1、斐波那契(兔子的生殖) 分别是n=0,n=原创 2017-02-15 22:47:28 · 1251 阅读 · 0 评论 -
数据结构线性表(一)之顺序存储结构思路
一:顺序存储,利用数组来实现顺序存储的.注:线性表长度是线性表数据元素的个数,所以恒小于或等于数组长度二:顺序存储结构代码#define maxsize 20typedef int ElemType;//typedef struct //具体typedef用法见博客{ElemType data[maxsize]; int length; //线性表当前长度}原创 2017-01-17 12:50:22 · 1060 阅读 · 0 评论 -
typedef struct解释
#include "stdio.h" 总的来说typedef作用是给某个类型起名字int main(){/*一typedef struct{int a;}stu;stu s1; //stu==struct student ,这里只是省略了student,可有可无,可与三对比s1.a=6;printf("%d",s1.a);*/二 stru原创 2017-01-17 12:57:46 · 1230 阅读 · 0 评论 -
数据结构线性表(二)之单链表读取、插入、删除
一.链式存储结构个人理解数据元素不再考虑相邻位置,而是只要哪有空位就到哪,只要让每个元素知道下一位元素的位置就好(用到指针)二.单链表相关概念推出1.数据域:ai元素存储自身信息2.指针域:ai元素存储指向后继元素存储位置的信息3.结点:包含数据域和指针域4.单链表:每个结点只包含一个指针域的线性表5.头指针(要素):链表中第一个结点的存储位置(线性表最后一个结点指针为原创 2017-01-19 10:54:05 · 2196 阅读 · 0 评论 -
栈与队列(三)中缀表达式转后缀表达式
中缀表达式=》后缀(逆波兰)表达式例如:1+2=>1 2 +分析原理:利用栈的记忆,符号推入栈,数字直接输出,当然有些时候在推入符号前,要先将栈内的元素Pop出来计算,再压入具体分析1+(2-3)*4+10/5=》1 2 3 - 4 × + 10 5 / +1.首先遇到第一个输入是数字1,数字在后缀表达式中都是直接输出,接着是符号”+“,入栈;2.第三个字符是”(“原创 2017-02-09 18:20:19 · 2080 阅读 · 0 评论 -
栈与队列(四)中缀计算器代码
中缀计算器(先中缀转后缀,再RPN计算)关于代码想说的:1.有人会问为什么要做两个栈 解决:因为在中缀转后缀中第一个栈被销毁的2.缓冲量的作用 解决:接收空格3.如何结合中缀转后缀和RPN计算 解决:将中缀转后追的输出放进数组string中,然后在RPN计算中本来要输入的直接在数组里拿就好,注意不要忘记空格/**原创 2017-02-09 19:06:07 · 673 阅读 · 0 评论 -
栈与队列(五)链队列(链式结构)
队列(以链式为主)定义:是只允许在一端进行插入操作,而在另一端进行删除操作的线性表与栈(后进先出)不同,队列是先进先出队头(删除的一端)(指头结点):出队列队尾(插入的一端)(指an):入队列例子:输入的缓冲区就是按照队列比如输入god 先进先出(输出),如果按照栈的思想就是输出为dog了。队列的链式存储结构(栈一般是顺序,而队列是链式)简称,链队列t原创 2017-02-11 15:16:10 · 1681 阅读 · 0 评论 -
栈与队列(六)之总结篇
学完栈与队列想想其实就是学它们的思想(栈:后进先出。队列:先进先出),其实抓住了这两个关键内容,再记住一些常用操作格式,就好!一、先讲讲栈的总结: 1.首先栈是后进先出的线性表(只在表尾进行操作)(想象子弹问题) 2.栈的应用在生活中处处都是,它最常用的还是顺序结构,在期间的学习,我也利用栈写了RPN计算器和它的进阶中缀计算器,还有中缀转后缀。都需要利栈的进出,栈顶的不断变换来实现,但在原创 2017-02-12 17:30:56 · 638 阅读 · 0 评论 -
数据结构线性表(三)单链表的具体操作及整表创建
一:头插法(就是你输入元素往前面插,所以你插入元素完后,你输入的最后一个数其实是在表的第一位)(创建表其实就是元素的插入,就是多了几个步骤)typedef struct Node{ ElemType data;//数据域 struct Node *next;//指针域 }Node;typedef struct Node *LinkList;/*n个元素,在主函数也原创 2017-01-23 21:49:08 · 713 阅读 · 0 评论 -
KMP算法(字符串的匹配)
一、BF算法(朴素算法)缺点:每次失配都是从头重新开始,效率低下#include <stdio.h>#include <string.h>int main(){ char s[]="abcdefgab"; char t[]="abcdef"; int a,b; int i=0,j=0; a=strlen(s); b=strlen(t); j=0原创 2017-02-23 15:58:56 · 773 阅读 · 1 评论 -
数据结构线性表(四)之静态链表(含完整代码)
静态链表(用数组不用指针)#define maxsize 1000 //假设数组最大长度为1000typedef struct{ElemType data;int cur; //游标}Component,StaticLinkList[maxsize];一.数组第一个元素和最后一个元素不存数据1.第一个元素存放备用链表(空闲位置)的一个结点的下标2.最后一个元素存放原创 2017-02-03 14:28:46 · 792 阅读 · 0 评论 -
树(一)结构与关系概念
一、树定义 一个数据 A.B.C……J都表示一个结点(结点由一个数据元素和若干个指向其子树的分支) 树:n(n>=0)个结点的有限集,n=0称为空树 n>0为非空树:只有一个根的结点,即A,n>1时,其余结点可分为m个互不相交的有限集(本身也为一棵树)称根的子树 T1 T2 本身为树,也称根的子树二、树定义注意点 n>0时根结点是唯一的原创 2017-02-24 15:49:22 · 1024 阅读 · 0 评论 -
数据结构预备知识总结
一、sizeof介绍 sizeof 1.是计算对象所占的字节数,通常用来查看变量、数组或结构体等所占的字节个数。 2.是单目操作符,类似于++,– 3.sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。使用方法 1.用于数据类型 sizeof使用形式: sizeof(原创 2017-09-13 16:34:44 · 556 阅读 · 0 评论 -
存储类型、ADT、纯C去引用、算法及设计原则、时间复杂度---基本概念
一、顺序印象&非顺序印象 是数据元素之间的关系在计算机中有两种不同的表示方法二、顺序存储结构&链式存储结构 由两种印象得到两种不同的存储结构1、顺序存储结构特点(连续) 借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系 方便查找,增删数据麻烦 没有结点概念,只有元素2、链式存储结构特点(不连续) 借助指示元素存储地址的指针表示数据元素之间的逻辑关系原创 2017-09-15 21:09:44 · 620 阅读 · 0 评论 -
栈与队列(一)进出栈(含二转十进制栈应用)
一、栈相关定义(栈的顺序存储结构(最常用))官方定义:栈是一个后进先出的线性表,它要求只在表尾进行删除插入操作(特殊线性表,只能在表尾操作)栈顶:表尾栈底:表头栈的插入操作:叫做进栈(入栈,压栈),类似子弹放入弹夹的动作栈的删除操作:叫做出栈(弹栈),如同子弹出夹空栈:栈中不含任何数据,此时栈顶就是栈底,然后数据从栈顶进入,顶底分离,栈容量变大。数据出栈时从栈顶弹出,栈原创 2017-02-05 14:42:50 · 1324 阅读 · 0 评论