![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C语言
文章平均质量分 65
爱写bug的疼老师
这个作者很懒,什么都没留下…
展开
-
C语言实现笛卡尔树
假设有一个序列{9,3,7,1,8,12,10,20,15,18,5},以此序列来建立一个笛卡尔树,则建好后的二叉树,中序访问该二叉树仍会得到原来的序列{9,3,7,1,8,12,10,20,15,18,5},且该二叉树还是一个堆(大根堆或小根堆)。每次插入新节点,从栈顶一个个比较,比新节点值大的节点弹出,直到找到合适位置。每次从右链的末端到根部进行遍历,找到合适的位置插入新节点,并把值更大的节点调整到新节点的左子树中。(设右链有k个节点),将新节点直接接到右链的右端,作为右链新的叶子节点即可,因为。原创 2023-01-06 20:04:38 · 509 阅读 · 0 评论 -
最大子序和问题(C语言求解)
题目描述如下:给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。这道题可用动态规划的方法求解,思路如下:以序列【-2,1,-3,4】为例,该序列的长度为4,如果求解它的最大子序列的和呢?假设我们已经知道,该序列中,所有长度为3的子序列的最大子序列的和,那么,你能否知道整个长度为4的序列的最大子序列的和?我们来分情况讨论,有以下三种情况:第一种是,最长的子序列发生了变化,也就是,最长的子序列长度为4,也就是【-2,1,-3,4】本身就是最..原创 2021-10-16 16:29:03 · 845 阅读 · 0 评论 -
P1055 ISBN号码问题
题目描述:每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括99位数字、11位识别码和33位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如00代表英语;第一个分隔符-之后的三位数字代表出版社,例如670670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。识别码的计算方法如下:首位数字乘以1原创 2020-07-04 17:58:06 · 260 阅读 · 0 评论 -
两种方法解决月度开销问题——C语言
问题描述如下:农夫约翰是一个精明的会计师。他意识到自己可能没有足够的钱来维持农场的运转了。他计算出并记录下了接下来 N (1 ≤ N ≤ 100,000) 天里每天需要的开销。约翰打算为连续的M (1 ≤ M ≤ N) 个财政周期创建预算案,他把一个财政周期命名为fajo月。每个fajo月包含一天或连续的多天,每天被恰好包含在一个fajo月里。约翰的目标是合理安排每个fajo月包含的天...原创 2020-04-08 09:52:47 · 1492 阅读 · 0 评论 -
利用栈实现二叉树的前序遍历——C语言
首先我们定义以下二叉树的数据结构,通过结构体定义,代码如下:struct Tree { int n; struct Tree* p; struct Tree* left; struct Tree* right;};struct BinaryTree { struct Tree* root;};为了完成深度优先搜索,我们需要借助于栈结构。包括压栈,出栈操作,基于数组实现...原创 2020-04-03 10:27:10 · 2849 阅读 · 0 评论 -
不借助指针实现链表——利用多数组实现
有些语言不提供指针,这时候我们怎么实现链表?可以借助数组来实现。基本思路如下:在链表中,之所以利用指针,主要是用来存储后继节点和前驱节点的位置。如果不用指针,使用数组下标也可以表示一个节点的位置。比如我们可以定义三个数组:key,next和prev,key[i]用来存放i号节点的值,next[i]用来存放i号节点的后继节点的下标,prev[i]用来存放i号节点的前驱节点的下标。这样借助于数组的...原创 2020-04-02 11:44:03 · 1011 阅读 · 0 评论 -
用带哨兵的双向循环链表,实现O(1)时间的UNION操作
问题描述:动态集合操作UNION以两个不相交的集合S1,和S2作为输入,并返回集合S1=S1US2, 包含S1和S2的所有元素。该操作通常会破坏集合S1和S2。试说明如何选用一种合适的表类数据结构,来支持0(1)时间的UNION操作。问题分析:分析题目的要求,首先S1和S2是不相交的,并且在进行合并的时候是可以破坏S1和S2的,所以我们可以想到链表。题目的要求是要在O(1)时间内完成U...原创 2020-04-01 11:48:42 · 297 阅读 · 0 评论 -
C语言实现单链表的逆转
问题描述:给出一个O(n)时间的非递归过程,实现队一个含n个元素的单链表的逆转。要求除存储链表本身所需的空间外,该过程只能使用固定大小的存储空间。问题分析:题目给我们的数据结构是单链表。我们在循环中,每次把链表的next指针指向它的前驱节点就行了。但是当前节点的next指针修改后,它原本的下一个节点就找不到了,所以我们需要一个额外变量保存下一个节点。这样,程序需要三个变量p,q,r,q...原创 2020-04-01 09:53:11 · 2439 阅读 · 0 评论 -
双端队列的实现——C语言
题目要求:插入和删除元素只能在同一端进行,队列的插入操作和删除操作分别在两端进行,与它们不同的,有一种双端队列(deque),其插入和删除操作都可以在两端进行。写出4 个时间均为0(1)的过程,分别实现在双端队列的两端插人和删除元素的操作,该队列是用一个数组实现的。解题思路:利用数组来存储元素,设置两个变量head和tail,分别记录队列头部元素的下标和尾部“将要插入”元素的下标。从尾...原创 2020-03-27 10:53:33 · 3872 阅读 · 1 评论 -
有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
这道题是谭浩强版C语言指针部分的练习题。拿到这道题,我第一印象是用链表来解决。不过既然是C语言的课后题,我们用数组加指针的思路来解决也无妨。解题思路如下:定义一个函数,接受人数n。我们初始化一个从1顺序排到n的数组,方便以后的操作。思路就是按顺序循环报数,每当报到3的时候,让当前元素退出(将值置为0代表退出)。同时用一个值来记录当前队伍中还剩多少人,当队伍中还剩一人的时候,循环结束。从...原创 2020-02-29 16:23:21 · 5756 阅读 · 1 评论 -
C语言关于定义动态数组的发现
今天在给学生培训的时候,讲到C语言中定义数组的时候,数组的长度只能是常量和常量表达式,而不能是变量(不能动态定义数组)。通过一段代码进行演示。#include<stdio.h>int main() { int len; scanf("%d",&len); int a[len]; for(int i=0;i<len;i++){ a[i]=i; pri...原创 2020-01-20 22:11:33 · 565 阅读 · 0 评论