数据结构
文章平均质量分 59
数据结构基础
代码雕刻家
这个作者很懒,什么都没留下…
展开
-
单链表的查找与长度计算
版本二:王道书版本while循环进行到第5次时p指向NULL,不满足下一次循环条件,跳出while循环,此时返回的p为NULL:代表查找失败最终可知当i值不合法时即i为负数或者i值大于链表长度时最终都返回NULL,因此只需要判断返回结果是否为NULL即可得知是否查找成功。a.计算时间复杂度需要要查找的元素在合法范围内。b.平均时间复杂度是指此次输入的i值它取的合法范围内的任何一个数字的概率都等可能的情况,具体的算法和顺序表的按位查找的分析方法一样。案例二:后插操作的加入右下角的InsertNext原创 2024-09-13 00:12:58 · 276 阅读 · 0 评论 -
单链表的建立
对于时间复杂度,最好的时间复杂度是第一次,因为此时内层循环即找第i-1个结点就不执行了(不满足j<i-1),内层循环和外层循环时间复杂度都是O(n),所以整个尾插操作的时间复杂度为O(n * n)。(i为1时内层循环走0次,i为2时内层循环走1次,以此类推,i为n时内层循环走n-1次,那么一共走0+1+2+...+(n-1)次,易知时间复杂度为O(n * n) )但这个时间复杂度较高,因此没必要每次都从头开始寻找,可以设置一个指针指向表尾的最后一个数据结点,然后当要在尾部插入一个新的数据元素时只需要对尾部结原创 2024-09-13 00:02:47 · 778 阅读 · 0 评论 -
单链表的插入和删除
//定义单链表结点类型int data;//每个结点存放一个数据元素//指针指向下一个结点//初始化一个单链表(带头结点)//分配一个头结点if(L==NULL) //代表内存不足,分配失败-->意味着带头结点的单链表无法创建else//头结点之后暂时还没有节点,所以指向NULL//判断单链表是否为空(带头结点)if(L->next==NULL) //头结点之后如果指向NULL,代表没有数据else。原创 2024-09-10 00:04:27 · 873 阅读 · 0 评论 -
算法的基本概念
一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。注:算法(用有限步骤解决某个特定的问题)必须是有穷的,而程序可以是无穷或者有穷的如:微信是程序,但不是算法,因为微信在一直工作;死循环也不是算法;操作系统也不是算法,即使关机了,但后台操作系统仍在进行即无穷;算法中每条指令必须有确切的含义,对于相同的输入必须得出相同的输出。例如:把第一行年龄按照递增排序如果第一次输出为第二行的结果,第二次输出第三行的结果,那么这就不是算法,因为尽管年龄排序的结果一致,但名字不一样,要想是算法,就必须输出结果要原创 2024-09-07 11:03:54 · 331 阅读 · 0 评论 -
顺序表的定义
比如数组,数组大小一旦确定,就不可以再被改变。ElemType代表数据类型,比如整型,浮点型等。原创 2024-09-07 10:56:05 · 310 阅读 · 0 评论 -
顺序表的插入与删除
在b和d之间插入c,此时就需要把d,e,f都向后移一位,腾出一个位置后插入c。问题规模n=L.length(表长),当添加一个元素后,长度为n+1,所以在第一个位置添加元素时,要把前n个元素后移,空出第一个位置,此时长度为n+1。删除c后,后面的d,e,f都要前移一个,数组长度减一。ListDelete第三个参数有个&,这样就使得main函数里的e和ListDelete函数里的e是同一个e,不加&,main函数里的e和ListDelete函数里的e就不是同一个e了,执行完ListDelet原创 2024-09-07 10:46:54 · 350 阅读 · 0 评论 -
顺序表的查找
以顺序表的静态分配为例:例二:上述图片注意:data[0]后的data[1]不是紧跟着data[0],而是在占据data[0]该有的内存后才分配data[1](内存大小与所占字节有关,如整型占4个字节)malloc函数返回的存储空间起始地址要转换为与数据元素的数据类型相对应的指针,是因为虽然指针指向的都是同一个地址,但是如果指针所指向的数据类型给定义错了,那么在访问数据元素时也会出现问题。二.按位查找的时间复杂度:能实现"随机存取"是因为所有顺序表当中所有的数据元素在内存里面都是连续存放原创 2024-09-07 10:50:48 · 178 阅读 · 0 评论 -
单链表的定义
相比于顺序表,单链表不可随机存取,因此单链表中查找数据必须是一个一个找-->查找效率低单链表每一个节点有数据元素和存放该元素的指针,该指针指向下一个节点GetElem方法解读:把单链表L中的第i个节点取出来,并返回。参数列表中LinkList L也可以用LNode *L。LNode是一个结构体类型,LNode *就代表返回了一个指针,因为p为指针。LinkList是指针类型,用->关键词访问数据。方法体解读:LNode *p=L->next;代表L是指针指向下一个节点。原创 2024-09-07 10:40:57 · 214 阅读 · 0 评论 -
线性表的定义和基本操作
x=1024;printf("test函数内部的x=%d \n",x);printf("调用test函数前x=%d \n",x);test(x);printf("调用test函数后x=%d \n",x);return 0;/*运行结果为调用test函数前x=1test函数内部的x=1024调用test函数后x=1*//*解析:主函数里有一个x,值为1,第一条打印语句里x为1,原创 2024-09-07 10:59:14 · 135 阅读 · 0 评论 -
数据结构绪论
数据元素用于描述一个个体。原创 2024-08-30 19:58:33 · 153 阅读 · 0 评论 -
算法的空间复杂度
形参n和i各占4个字节,共8字节,是常数,可忽略。而数组flag所占字节是4 * n个,不是常数,不可忽略n为5和n为4时都有a,b,c的创建,只是地址不同,n为其他值时也一样。形参n和a,b,c都固定各占4个字节,共16个字节,所以每一次函数调用都大概需要16个字节来存储相应的信息即每一次aB个内存,而且共n次,刚好共占naB个内存数组flag所占字节和n有关,每一次函数调用n都会变化,因此flag所占字节每一次都会变化。原创 2024-08-31 21:46:19 · 321 阅读 · 0 评论 -
数据结构的三要素以及数据类型和抽象数据类型
顺序存储链式存储索引存储散列存储注:顺序存储数据之间必须相邻。链式存储,索引存储和散列存储的数据之间是不相邻的,即离散,也叫非顺序存储或离散存储。如连续的数据可用顺序存储,找不到连续的数据可用非顺序存储如上述例子中在b和d之间插入c,对于顺序存储插入c的话要把大量元素进行移动空出位置后才能插入c,而非顺序存储只需要在b和d之间找一个空的地方插入c再修改指针指向的地址即可,效率比顺序存储高。原创 2024-08-30 19:56:49 · 506 阅读 · 0 评论 -
算法的时间复杂度
假设上述标记的5条语句执行时间相同(实际上时间不同,但考虑太多外在条件,就难以论述时间复杂度)语句频度:语句1-->只执行一次,因为顺序结构语句2-->执行了3001次,前3000次是符合i<=3000(i初值为1,n为3000,最后一次是i为3000时进行循环后i为3001,最后进行了一次循环条件的判断,发现不符合,跳出循环)语句3-->执行了3000次,因为只有进入循环才执行i++,循环了3000次语句4-->执行了3000次,因为只有进入循环才执行该语句,循环了3000次语句5-->只执行一次,因为顺原创 2024-08-31 21:42:17 · 539 阅读 · 0 评论 -
红黑树,红黑规则,添加节点处理方案详解
根节点就是最上面的第一个节点。原创 2024-08-10 23:24:20 · 246 阅读 · 0 评论 -
二叉树,二叉查找树,平衡二叉树
1)每一个节点(也叫结点)都是一个独立的对象-->当中不仅要存数据值,还要存父节点地址值,左子节点地址值,右子 节点地址值2)没有父节点或者子节点的节点就记为null要从根节点*开始查找,之后根据小的在左边,大的在右边进行查找即可。原创 2024-07-31 22:18:17 · 398 阅读 · 0 评论 -
数据结构概述
栈,队列,数组,链,二叉树,二叉查找树,平衡二叉树,红黑树。1.每种数据结构长什么样子?原创 2024-07-25 11:54:43 · 283 阅读 · 0 评论 -
栈,队列,数组,链表
比如上图中要查找C,但此时只有A知道C的地址值,A的地址值又只有head(头结点)知道,导致要从头开始找,效率低。一个数据B,此时只需要创建一个新结点,假设地址为54。对于单向链表,只能从头结点开始,一个一个往后找;->如果离头近,从头开始一个一个往后找,b.每一个结点都是一个独立的对象;b.比如删除数据B,D之间的数据C。a.双向链表的效率比单向链表的高;会先判断第N个元素离头近还是离尾近。如果离尾近,从尾开始一个一个往前找。a.比如上图中要在数据A和C之间。d.第一个结点称为头结点。原创 2024-07-25 12:03:07 · 294 阅读 · 0 评论