大数据秃头族
专栏持续更新,仅代表个人的笔记,侵权删
展开
-
【头歌】循环队列及链队列的基本操作
define MAX_QSIZE 5 // 最大队列长度+1struct SqQueue{ QElemType *base;// 初始化的动态分配存储空间 int front;// 头指针,若队列不空,指向队列头元素 int rear;// 尾指针,若队列不空,指向队列尾元素的下一个位置};使用顺序队列时会出现“假溢出现象”,为了能够充分地使用数组中的存储空间,可以把数组的前端和后端连接起来,形成一个环形的表,即把存储队列元素的表从逻辑上看成一个环。这个环形的表叫做循环队列。原创 2023-01-30 20:34:31 · 3897 阅读 · 0 评论 -
【头歌】构建哈夫曼树及编码
设二叉树具有n个带权值的叶子结点,从根结点到每个叶子结点都有一个路径长度。从根结点到各个叶子结点的路径长度与相应结点权值的乘积的和称为该二叉树的带权路径长度,记作:其中,wi为第i个叶子结点的权值,li为第i个叶子结点的路径长度。例如:以上二叉树的带权路径长度值:给定一组具有确定权值的叶子结点,可以构造出许多形状的二叉树,把其中具有最小带权路径长度的二叉树称为哈夫曼树。原创 2023-08-26 18:32:24 · 2241 阅读 · 1 评论 -
【头歌】二叉树的二叉链表存储及基本操作
中序遍历序列的特点:若已知二叉树的根结点值,以该值为界,将中序遍历序列分为两部分,前半部分为左子树的中序遍历序列,后半部分为右子树的中序遍历序列。中序遍历的非递归和前序遍历的非递归很相似,只是前序遍历是根-左-右,而中序遍历左-根-右,也就是说,中序遍历是:先遇到根节点不访问,而是直接压入栈,当左子树节点为空时,取出左子树节点,并访问左子树节点的右子树。③ 先序遍历右子树。因为二叉树的定义就是递归定义,因此采用递归的方法去实现二叉树的三种遍历,所谓先序、中序、后序,区别在于访问根结点的顺序。原创 2023-07-19 23:30:47 · 1745 阅读 · 0 评论 -
【头歌】二叉树的顺序存储及基本操作
从数据结构角度看,树包含n(n≥0)个结点,当n=0时,称为空树;非空树的定义如下:有且仅有一个结点d0∈D,它对于关系R来说没有前驱结点,结点d0称作树的根结点。除根结点d0外,D中的每个结点有且仅有一个前驱结点,但可以有多个后继结点。D中可以有多个终端结点。【例】 有一棵树T=(D,R),其中 D={A,B,C,D,E,F,G,H}, R={r} r={,,,,,,} 画出其逻辑结构图。原创 2023-05-11 17:10:41 · 2517 阅读 · 1 评论 -
【头歌】串的运算及应用
串的模式匹配设有两个字符串S和T,设S为主串,T为子串,也称为模式。在主串S中查找与模式T相匹配的子串,如果匹配成功,确定相匹配的子串中的第一个字符在主串S中出现的位置。第2关中实现的字符串匹配的简单算法在实际应用系统中效率低,而 KMP 算法可以实现高效的字符串匹配。在右侧编辑器中补充代码,完成StrIndex_BF函数,以实现串的模式匹配的 BF 算法。在右侧编辑器中补充代码,完成GetNext函数,以实现串的模式匹配的 KMP 算法。本关任务:实现字符串的模式匹配的简单算法(BF算法)。原创 2023-02-08 17:20:52 · 2968 阅读 · 0 评论 -
【头歌】数组-稀疏矩阵的转置
接下来依次扫描A.data,先判断A.data[0],取出A.data[0].j用变量k保存(k=A.data[0].j),表示该三元组是A中第k列第一个非零元,则其在B.data中的位置为q=y[k],接着将该三元组存入B.data[q]中,然后y[k]++,以便将第k列的下一个非零元存放到B.data下一个位置;其中,x[i]表示A中第i列的非零元的个数,y[i]初始值表示A中第i列第一个非零元在B.data中的位置。稀疏矩阵是指非零元素的个数远远少于总的元素个数,且非零元素的分布没有规律。原创 2023-05-11 16:50:31 · 1397 阅读 · 0 评论 -
【头歌】链栈的基本操作及应用
另外,在算法的开始和结束时,栈都应该是空的,所以匹配到最后还要判断栈是否为空,若空,则说明匹配成功,返回1。其中表达式只包含三种括号,花括号{}、中括号[]、圆括号(),即它仅由 (、)、[、]、{、}六个字符组成。预期输出: 栈中元素依次为:12 47 5 8 6 92 45 63 75 38 4 29 弹出的栈顶元素 e=29 栈空否:0(1:空 0:否) 栈顶元素 e=4 栈的长度为11 清空栈后,栈空否:1(1:空 0:否)// 若栈不空,则用e返回S的栈顶元素,并返回OK;原创 2023-01-30 20:25:46 · 3375 阅读 · 0 评论 -
【头歌】顺序栈的基本操作及应用
define STACK_INIT_SIZE 100 //存储空间初始分配量#define STACKINCREMENT 10 //存储空间分配增量// 定义栈元素类型为整型//栈的基址即栈底指针//栈顶指针//当前分配的空间}SqStack;原创 2023-01-30 20:07:33 · 3785 阅读 · 0 评论 -
【头歌】汉诺塔(Hanoi)的递归算法
因此,依据上法,可解决n -1个盘子从A杆移到B杆(第一步)或从B杆移到C杆(第三步)问题。现在,问题由移动n个盘子的操作转化为移动n-2个盘子的操作。3、2,直到移动1个盘的操作,而移动一个盘的操作是可以直接完成的。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。(1)以C盘为中介,从A杆将1至n-1号盘移至B杆;原创 2023-01-28 20:47:19 · 2446 阅读 · 0 评论 -
【头歌】求解n皇后问题
用数组int q[N]表示棋盘状态,例如q[1]=1表示第1行皇后放在第1列。皇后k在第k行第q[k]列:(k,q[k]) 对于(i,j)位置上的皇后,是否与已放好的皇后(k,q[k])(1≤k≤i-1)有冲突呢?q[k]== j 时,两皇后在同一列上;abs(k-i)==abs(q[k]-j) 时,两皇后在同一斜线上。两种情况两皇后都可相互攻击。本关任务:在n×n的方格棋盘上,放置n个皇后,要求每个皇后不同行、不同列、不同左右对角线。当n=6时,如下图所示是6皇后问题的一个解。开始你的任务吧,祝你成功!原创 2023-01-28 20:35:57 · 761 阅读 · 4 评论 -
【头歌】函数的递归调用
要计算数组a从起始序号start到结束序号end之间数组元素的最大值: (1)如果数组a起始序号start等于结束序号end,那么返回值为此序号数组元素值a[start]。要计算数组a从起始序号start到结束序号end之间数组元素的和: (1)如果数组a起始序号start等于结束序号end,那么返回值为此序号数组元素值a[start]。(2)如果数组a起始序号start小于结束序号end,那么返回值为a[start]与数组a从start+1到end的之间数组元素的和。根据提示,在右侧编辑器补充代码。原创 2023-01-28 20:34:30 · 3139 阅读 · 0 评论 -
【头歌】双向链表的基本操作
在双链表中p结点之后插入s结点的操作步骤如下: ① 将结点s的next域指向结点p的下一个结点: s->next=p->next;在双链表中删除p结点(其前驱结点为pre)的操作: ① 若p不是尾结点,则将其后继结点的prior域指向pre结点: p->next->prior=pre ② 将pre结点的next域改为指向p结点的后继结点: pre->next=p->next。在带头结点的双向链表中,通常头结点的数据域可以不存储任何信息,尾结点的next域置为NULL。原创 2023-01-25 23:05:58 · 1936 阅读 · 0 评论 -
【头歌】循环单链表的基本操作
an),LB=(b1,b2,…算法思想: 先找到两个链表的尾,并分别由指针p、q指向它们,然后将第一个链表的尾结点与第二个表的第一个结点链接起来,并修改第二个表的尾结点,使它的链域指向第一个表的头结点。将尾结点的next域用一个特殊值NULL(空指针,不指向任何结点,只起标志作用)表示,这样的单链表为非循环单链表,通常所说的单链表都是指这种类型的单链表。=L作为循环条件,当p==L时循环结束,此时p回过来指向头结点,所以p应该初始化指向第一个数据结点而不是头结点,否则循环内的语句不会执行。原创 2023-01-25 23:01:54 · 3557 阅读 · 0 评论 -
【头歌】有序链表的插入删除操作
用一个循环控制ppre和pcur向后移动,当ppre指向的结点值和pcur指向的结点值相等,那么ppre的指向的位置保持不动,将pcur的指向先传递给pdel,然后pcur向后移一个位置,再将ppre指向的结点作为pcur指向的结点的前驱,这两个结点再次保持相邻,最后释放pdel指向结点的空间,达到删除多余结点的效果。//带头结点的单链表L,其结点存储的数据是递增有序的,将e插入L,并保持该单链表的有序性。//带头结点的单链表L,其结点存储的数据是递增有序的,将e插入L,并保持该单链表的有序性。原创 2023-01-24 21:47:08 · 2576 阅读 · 0 评论 -
【头歌】单链表的排序操作
设置两个指针,一个是当前指针,一个是尾指针,当前的指针指向头节点,将尾指针指向最后一个节点,在当前的指针不等于尾指针时是一次循环,第一次将当前一个节点的值与下一个节点的值相比较,直到下一个节点和尾指针相等(即为空),结束本次循环,最后当前的指针赋给尾指针,当前指针重新指向头结点,再两两相比较,把最大(或最小)的数放在最后。然后在剩下的单链表当中再找值最小的结点与第二个位置结点的数据交换,如此循环到倒数第二个位置结点的数据和最后一个结点数据比较为止。开始你的任务吧,祝你成功!开始你的任务吧,祝你成功!原创 2023-01-24 21:35:42 · 2194 阅读 · 0 评论 -
【头歌】单链表的基本操作
由于单链表中每个结点的存储地址是存放在其前趋结点的指针域中的,而第一个结点无前趋,头指针L指向第一个结点,对于整个单链表的读取必须从头指针开始,同时,由于单链表中最后一个结点的指针域为“空”(NULL),没有直接后继元素,对于整个单链表的读取必须在尾结点结束。要在带头结点的单链表L中删除第i个结点,则同样要先找到第i-1个结点,使p指向第i-1个结点,使q指向第i个结点,然后令第i-1个结点的指针域指向第i+1个结点,而后删除q指向的第i个结点并释放结点空间。= NULL时,才能进行删除结点的操作。原创 2023-01-23 20:26:12 · 12206 阅读 · 1 评论 -
【头歌】顺序表的基本操作
时,在函数体内不需要改变主调函数中的实参变量的值,只需读取主调函数中的实参变量的值,因此函数形参定义为变量,采用值传递。,i-1上的结点,依次后移到位置n,n-1,…关于逆置,有一种非常暴力的解决方法,就是单独开辟一个同等大小的顺序表,然后新表从前往后遍历,同时原表从后往前遍历,依次赋值,最后得到的就是逆置后的顺序表。,ai−1,ai,ai+1,…顺序表的就地逆置,只需让顺序表中的数据元素头尾依次交换即可,即交换第一个元素和最后一个元素,第二个和倒数第二个,依此类推,这种方法的空间复杂度为O(1)。原创 2023-01-23 20:02:29 · 10391 阅读 · 2 评论