![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C&&C++
yuzhang_zy
现在的我不是最好的我,未来的我才是最好的我,每一篇博客都记录着我的成长
展开
-
C语言中的printf与scanf函数
1. printf函数的格式字符串① %-md:左对齐,若m比实际少时,按实际输出,不足右补空格#include<stdio.h>int main(void){ int a = 12; printf("%5d\n", a); return 0;} 输出:②%md :右对齐,若m比实际少时,按实际输出,不足左补空格与上面的%-md类似③ %...原创 2019-09-25 20:35:59 · 716 阅读 · 0 评论 -
C语言使用链表实现栈
1. 使用C语言中的链表来实现栈2. 我们知道栈的特点是先进后出,而链表中的头插法正好满足我们的需求,因为头插法后面插入的节点位于链表的开头,所以我们可以使用头插法来插入节点,在弹出节点的时候弹出链表的第一个节点即可,而第一个节点是很容易找出来的,所以可以很轻松地实现栈的压入和弹出操作3. 下面是具体的代码:#include<stdio.h>#include<ma...原创 2019-06-30 09:14:18 · 6238 阅读 · 3 评论 -
整数散列
1. 散列是常用的算法思想之一,在很多程序中可能都会使用到,我们先看看这样一个问题,给出N个整数,再给出M个正整数,问这M个数中的每个数在N个数中出现的次数是多少,其中N,M <= 10 ^ 5,对于这个问题我们可以直接for循环遍历待查询的正整数x,遍历N个数,看是否存在一个数与x是相等的,时间复杂度是O(n * m),当N和M都很大的时候是计算不出来的那么该怎么样做呢?这里就需要使用...原创 2019-07-05 09:42:58 · 308 阅读 · 0 评论 -
C语言使用头插法翻转链表
1. 问题描述:有一个线性表,采用带有头结点的单链表L来进行存储,设计一个算法将其逆置,要求不能够建立新节点只能够通过表中已有的节点进行重新组合来完成2. 思路分析:① 我们知道链表建立的头插法中的元素顺序与原来的插入的顺序是相反的,所以我们可以将链表L中的元素作为逆转后L的元素来源,即将L->next设置为空,然后将头结点后的一串节点使用头插法逐个插入到L中,这样新的L中的顺序...原创 2019-06-29 21:55:18 · 1959 阅读 · 0 评论 -
插入排序
1. 问题描述:给定一个整型数组,使用插入排序算法对其进行排序并且输出排序结果2. 算法思想:每一趟将待排序的关键字按照其值的大小插入到已经排序好的部分有序序列的适当位置上,也就是将待插入的关键字从后往前进行扫描插入到已经排好序的部分有序序列中,下面是具体的代码:#include<stdio.h>void insertSort(int arr[], int len){...原创 2019-07-05 09:21:38 · 160 阅读 · 0 评论 -
合并两个顺序表使其合并后的顺序表是有序的
1. 问题描述:设顺序表使用数组A[]表示,表中元素存储在数组下标0~m + n - 1的范围内,前m个元素递增有序,后n个元素也是递增有序的,设计一个算法,使得整个顺序表是有序的2. 思路分析:① 将数组A中的m + n个元素看成是两个顺序表:表L和表R,将数组当前状态看做是起始状态,即此时表L由A[]中的前m个元素构成,表R由A[]中的后n个元素构成,要使A[]中的m + n个元素...原创 2019-06-29 10:54:48 · 1427 阅读 · 0 评论 -
C语言实现将两个递增有序的链表合并成一个非递增有序链表
1. 问题描述:A和B是两个单链表(带有表头节点),其中元素是递增有序的,设计一个算法,将A和B归并成一个按元素值非增减有序的链表C,C由链表A和B的节点组成2. 思路分析:① 我们知道头插法最终创建的链表的顺序与插入的顺序正好是相反的,所以我们可以修改之前的将两个递增有序的链表合并成一个非递减的链表程序,将头插法修改为尾插法② 与头插法不同的是,头插法在while循环之后可以直接...原创 2019-06-29 10:37:04 · 5291 阅读 · 0 评论 -
C实现链表的头插法
1. 问题描述:将数组的所有元素使用头插法插入到一个链表中,最终的序列与插入的序列是相反的2. 下面是具体的C语言代码:#include<stdio.h>#include<malloc.h>typedef struct node{ int data; node *next;}LNode; LNode *C;LNode* createListF(...原创 2019-06-29 10:20:04 · 392 阅读 · 0 评论 -
C语言实现将两个递增有序的链表合并成一个非递减有序链表
1. 问题描述:A和B是两个单链表(带有表头节点),其中元素是递增有序的,设计一个算法,将A和B归并成一个按元素值非递减有序的链表C,C由链表A和B的节点组成2. 思路分析:① 因为A和B都是递增有序的,要使归并后的链表还是有序的,可以从A和B中挑选出最小的元素,插入到C的尾部,这样当A和B中的元素都插入到C中的时候一定是有序的,所以需要定义两个指针分别指向链表A和链表B,这样才可以对...原创 2019-06-29 09:30:21 · 7100 阅读 · 0 评论 -
二叉查找树的应用
1. 题目来自于PAT A 1043,问题的大概描述如下:给出一个N个正整数来作为一棵二叉排序树的节点插入顺序,问:这串序列是否是该二叉树的先序序列或者是二叉排序树的镜像树的先序序列,镜像树指的是交换根节点的左右子树形成的二叉树,如果对于输入的序列与二叉排序树的先序序列是一样的那么输出YES,并且输出二叉排序树的后序遍历的序列,如果输入的序列与二叉排序树的镜像树的先序序列是一致的,那么输出YE...原创 2019-06-28 19:07:41 · 1306 阅读 · 0 评论 -
字符串哈希
1. 问题描述:字符串hash是指将一个字符串S映射为一个整数,使得该整数可以尽可能唯一地代表字符串S,那么在一定程度上,如果两个字符串转换成的整数相等,那么就可以认为这两个字符串相同在字符串hash方法中,对只有大写字母的字符串,它将字符串当做26进制的数字,然后将其转换为十进制,也就是下面的式子,其中str[i]表示的是字符串的i号位置,index函数将A~Z转换为0~25,H[I]表...原创 2019-07-04 11:13:33 · 888 阅读 · 0 评论 -
输出树中路径之和等于给定值的所有路径
1. 问题描述:题目来自于PAT A 1053 Path of Equal Weight,具体描述如下:Given a non-empty tree with rootR, and with weightWiassigned to each tree nodeTi. Theweight of a path fromRtoLis defined to be th...原创 2019-06-28 12:04:30 · 1201 阅读 · 0 评论 -
C++algorithm头文件下sort函数的使用
1. sort函数是用来排序的函数,它是根据具体的情况使用不同的排序方法,效率较高,一般来说,不推荐使用C语言中的qsort函数,原因是qsort函数使用起来比较麻烦,涉及到很多指针的操作,而且在sort函数在实现中规避了经典快速排序中可能出现的会导致实际复杂度退化到O(n ^ 2)的极端情况,所以我们在排序的时候尽量使用C++下的sort函数来进行排序2. 下面是sort函数的常见用法:...原创 2019-07-05 11:24:10 · 18981 阅读 · 0 评论 -
将一个链表分为奇偶两个链表
1. 问题描述:设计一个算法,将一个头结点为A的单链表(其数据域为整数)分解成两个单链表A和B,使得A链表只含有原来链表data域为奇数的节点,而B链表只含有原链表中data域为偶数的节点,而且保持原来的顺序2. 思路分析:① 这个问题不是在线网上评测系统上的,所以没有标准的输入和输出数据,只能够通过简单的数据来判断程序的逻辑是否正确,首先在将原来的链表分开之前,我们需要将创建出一个单...原创 2019-06-30 13:52:26 · 9299 阅读 · 1 评论 -
PAT B1040有几个PAT(递推)
1. 问题描述:字符串APPAPT中包含了两个单词"PAT",其中第一个PAT是由第二位(P),第四位(A),和第六位(T)组成的,第二个PAT是由第三位(P)、第四位(A),和第六位(T)组成的,现给定字符串,问一共可以形成多少个PAT?2. 思路分析:① 假如使用暴力破解依次遍历字符串来判断是否形成了PAT,那么肯定是超时的② 我们可以使用另外一个思路来思考问题,对于一个确定的...原创 2019-07-06 21:02:47 · 198 阅读 · 0 评论 -
C语言生成指定范围内的随机数
1. C语言中有产生随机数据的函数,需要添加stdlib.h与time.h头文件,首先需要在main函数的开头加上srand((unsigned)time(NULL));,这个语句将产生随机数的种子,然后再需要使用随机数的地方使用rand函数,但是rand()函数只能够生成[0,RAND_MAX]范围内的整数,RAND_MAX是stdlib.h头文件中的一个常数(32767),在不同的系统之下这个...原创 2019-07-06 20:22:26 · 64125 阅读 · 9 评论 -
二路归并排序的递归写法与迭代写法
1. 问题描述:对于给定的序列使用二路归并排序算法对其进行排序2. 思路分析:① 二路归并排序可以看做是一种分而治之的过程:先将序列分为两半,对每一半分别进行排序之后然后再将其合并起来,而分成的一般又可以使用同样的方法进行排序,之后将会得到一个有序的序列,从上面的描述中我们可以看到问题的规模是在逐渐变小的,而且都是使用相同的办法去解决的,所以第一种方法可以使用递归去解决② 使用递归...原创 2019-07-06 19:14:38 · 1399 阅读 · 0 评论 -
C语言实现快速幂的递归与迭代求解
1. 问题描述:给定三个正整数a,b(a < 10 ^ 9,b < 10 ^ 18,1 < m < 10 ^ 9)求解出a ^ b % m2. 思路分析:① 对于上面这个问题,最简单的思路是使用一个循环来进行累乘,直到累乘的次数等于了b那么循环就结束了,但是假如按照这样的思路来解决,对于O(b)的时间复杂度为O(10 ^ 8)都比较难支持了,更何况是10 ^ 1...原创 2019-07-05 20:31:46 · 929 阅读 · 1 评论 -
C++中algorithm头文件下的常用函数
1. algorithm常用的函数有:① max、min和abs函数,下面是具体的代码:#include<stdio.h>#include<algorithm>using namespace std;int main(void){ int x = 1, y = -2; printf("%d %d\n", max(x, y), min(x, y)); p...原创 2019-07-05 10:52:09 · 4840 阅读 · 1 评论 -
C++实现链表的尾插法
1. 问题描述:将数组的所有元素使用尾插法插入到一个链表中,最终的序列与插入的序列是一致的具体节点的插入如下图:2. 下面是具体的C语言代码:#include<stdio.h>#include<malloc.h>typedef struct node{ int data; node *next;}LNode; LNode *C;//返回...原创 2019-06-29 10:01:49 · 3405 阅读 · 2 评论 -
起点到终点的最少步数(广度优先搜索)
1. 问题描述:给定一个n * m大小的迷宫,其中*代表不可通过的墙壁,而.代表平地,S表示起点,T表示终点,移动过程中,如果当前位置是(x,y)(下标从0开始),而且每次只能前往上下左右(x,y + 1)(x,y -1)(x - 1,y)(x + 1,y)四个位置的平地,求从起点S到达终点T的最少步数......*.*..*S*..***....T*2. 思路分析:①...原创 2019-06-30 18:27:50 · 2657 阅读 · 0 评论 -
好朋友(并查集)
1. 问题描述:有一个叫做“数码世界”奇异空间,在数码世界里生活着许许多多的数码宝贝,其中有些数码宝贝之间可能是好朋友,并且数码宝贝世界有两条不成文的规定:第一,数码宝贝A和数码宝贝B是好朋友等价于数码宝贝B与数码宝贝A是好朋友第二,如果数码宝贝A和数码宝贝C是好朋友,而数码宝贝B和数码宝贝C也是好朋友,那么A和B也是好朋友,现在给出这些数码宝贝中所有好朋友的信息,问:可以把这些数码宝...原创 2019-06-30 18:00:11 · 780 阅读 · 0 评论 -
C语言头插法创建双链表
1. 问题描述:使用头插法创建双链表2. 与单链表不同的是,双链表的结构体中多了一个变量就是指向当前节点的前驱节点,这样我们在循环遍历的时候可以通过当前节点的前驱指针找到前驱节点,在创建双链表的时候比单链表多了一个步骤就是对于前驱指针的操作,下面是使用C语言的头插法实现的双链表,具体的代码如下:#include<iostream>#include<malloc.h&g...原创 2019-06-30 17:07:59 · 1935 阅读 · 3 评论 -
C++解决区间覆盖问题
1. 在解决区间覆盖问题之前我们需要清楚一个概念,那就是贪心的概念,使用贪心的方法求解的是一类最优化问题的方法,它总是考虑在当前状态下局部最优(或者较优)的策略,来使全局的结果达到最优(或着较优)显然,如果采取较优而非最优的策略(最优策略不存在或者是很难想到)得到的全局结果也不是最优的,因此我们在使用贪心法来求解最优化问题的时候需要对采取的策略进行验证.证明的思路一般是数学归纳法或者是反证法,...原创 2019-07-05 14:59:30 · 3175 阅读 · 0 评论 -
求解出链表A - B的差集
1. 问题描述:已知递增有序的单链表A、B(A、B中元素的个数分别为m,n,而且A、B都带有头节点)分别存储了一个集合,请设计算法,以求出两个集合的差集A - B(仅在链表A中出现而不在链表B出现的元素构成的集合),将差集保存在单链表A中,并保持元素的有序性2. 思路分析:① 首先我们需要创建出两个递增有序的单链表A和B,这里使用两个给定的递增有序的数组来创建出两个单链表,创建出来之后...原创 2019-06-30 14:45:56 · 2119 阅读 · 1 评论 -
由中序遍历与后序遍历确定一棵二叉树
1. 问题描述:题目来自于PAT A 1020,具体描述如下:Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level ...原创 2019-06-28 10:14:16 · 11251 阅读 · 4 评论 -
01背包的深度优先搜索
1. 问题描述:有n件物品,每件物品的重量是w[i],价值为c[i],现在有一个容量为V的背包,问如何选取物品放入到背包中使得背包内物品的总价值是最大的,其中每种物品都是只有一件的2. 对于01背包问题,是条件比较简单的背包问题,典型和高效的解法是使用使用动态规划的思想,求出状态方程来进行求解,但是对于这一类可以使用动态规划的最优问题我们也可以使用深度优先搜索来进行解决,可以锻炼我...原创 2019-06-27 19:25:53 · 1064 阅读 · 0 评论 -
C++实现的邻接表
1. 在学习图的存储方式中,邻接矩阵和邻接表是两种比较常用的存储图的方式,下面使用的是C语言实现的邻接表2. 具体的实现过程如下:① 首先使用结构体声明图的结构体,图中顶点的结构体,以及指向下一条边的结构体,这些可以参照严蔚敏版的数据结构来写出具体的数据结构:typedef struct ArcNode{ int adjvex;//该边所指向的节点的位置 struct ArcN...原创 2019-06-17 20:09:54 · 9233 阅读 · 4 评论 -
Dijkstra算法输出最短路径
1. 之前我们使用Dijstra算法可以求解出从源点到达其余顶点的最短距离,那么怎么样求解出源点到达v顶点最短距离中所经过的顶点呢?2. 算法的执行过程如下:① 其实也很简单,我们只需要在原来使用Dijstra算法求解最短距离的基础上增加上一个pre数组来记录从源点s到顶点v的最短距离中的前一个节点,这样当我们发现可以通过中间顶点u使得从源点s到顶点v的距离更短的时候可以记录从源点到达顶点...原创 2019-06-21 17:30:25 · 2960 阅读 · 3 评论 -
C++实现Dijkstra算法(单源路径最短算法)
1. Dijstra算法求解的是有向图中一个顶点到其余顶点的最短路径Dijkstra算法思想:设有两个顶点集合S和T,集合S中存放的图中已经找到最短路径的顶点,集合T中存放图中剩余顶点,初始状态的时候,集合S中只包含源点v0,然后不断从集合T中选取到顶点v0路径长度最短的顶点v并入到集合S中去,集合S每并入一个新的顶点,都要修改顶点v0到集合T中顶点的最短路径长度值总结起来我感觉主要有两步...原创 2019-06-21 14:35:05 · 1570 阅读 · 0 评论 -
C++邻接矩阵存储图的深度优先搜索
1.在数据结构中对于图的存储主要有三种方式,分别为邻接矩阵,邻接表和边集,前两种比较常用,下面使用的是C++语言邻接矩阵来存储图并实现深度优先搜索遍历2. 下面是具体的执行过程:① 对于深度优先遍历邻接矩阵存储的图来说比较简单,只需要使用一个标记数组来标记当前的顶点是否已经被访问即可,从图的一个顶点开始寻找邻接点,也就是当前顶点与其他存在联系的顶点,每访问过一个顶点那么标记顶点已被访问...原创 2019-06-21 13:30:18 · 1133 阅读 · 0 评论 -
C++邻接矩阵存储图的广度优先搜索
1. 在数据结构中对于图的存储主要有三种方式,分别为邻接矩阵,邻接表和边集,前两种比较常用,下面使用的是C++语言邻接矩阵来存储图并实现广度优先搜索遍历2. 下面是具体的实现过程:① 实现邻接矩阵存储图主要是使用的二维数组来存储从起始顶点到结束顶点相应的值即可,假如是无向图来说我们需要从起始顶点和结束顶点两端进行标记,经常的做法是标记为1表示,即graph[u][v] = 1和graph[...原创 2019-06-21 12:03:35 · 528 阅读 · 0 评论 -
C++邻接表存储图的深度优先搜索
1. 在数据结构中对于图的存储主要有三种方式,分别为邻接矩阵,邻接表和边集,前两种比较常用,下面使用的是C++语言vector来实现邻接表并且实现深度优先搜索因为对于初学者来说,使用链表来实现邻接表的话过程比较复杂,不太容易理解,存在多个结构体之间的相互嵌套,所以我们在学习的时候可以使用简单一点的工具来实现邻接表2. 下面是具体的实现过程:① 由于vector变长数组之称,因此可以开一...原创 2019-06-21 10:56:45 · 1172 阅读 · 0 评论 -
C++语言传递参数测试
1. 我们在写C++语言程序的时候经常会遇到函数中的形参与实参的传递与修改问题,假如我们希望传递的参数在函数中修改之后在主函数中的参数也对应同样的变化,我们可以在函数的形参中加上取地址符就可以了,假如不希望参数传递到函数中主函数中的参数也跟随变化那么我们不加上取地址符即可2. 下面是具体的测试代码:第一个代码输出7,第二个代码输出5#include<iostream>u...原创 2019-06-20 20:53:26 · 158 阅读 · 0 评论 -
选择排序
1. 选择类排序的主要动作是 "选择",简单选择排序采用最简单的选择方式,从头至尾顺序扫描序列,找出最小的一个关键字,和第一个关键字进行交换,接着从剩下的关键字中继续这种选择和交换,最终使得序列是有序的,时间复杂度为O(n ^ 2)2. 具体的代码如下:#include<stdio.h>#include<iostream>using namespace std...原创 2019-06-20 11:34:40 · 146 阅读 · 0 评论 -
冒泡排序
1. 冒泡排序是通过一系列的 "交换"动作完成的,首先第一个关键字和第二个关键字进行比较,如果第一个大,则两者交换,否则不交换,然后第二个关键字和第三个关键字进行比较,如果第二个关键字大那么两者交换,否则不交换....一直按照这种方法交换下去,最终最大的那个关键字被交换到了最后,一趟冒泡排序完成,经过多趟这样的排序,最终使得整个序列是有序的2. 具体的代码如下:#include<s...原创 2019-06-20 11:28:03 · 185 阅读 · 0 评论 -
堆排序
1. 堆是一种数据结构,可以把堆看成是一棵完全二叉树,这棵完全二叉树满足:任何一个非叶子节点的值不大于(或者不小于)其左右孩子节点的值,若父节点的值大于左右孩子的值那么这样的堆叫做大顶堆,若父节点的值小于其左右孩子的值那么这样堆叫做小顶堆根据堆的定义可以知道,代表堆的这颗完全二叉树的根节点的值是最大的(或者是最小的)因此将一个无序列调整为一个堆,就可以找到这个序列的最大值或者是最小值,然后将找...原创 2019-06-20 10:23:43 · 194 阅读 · 0 评论 -
手动创建一棵二叉树
1. 由于很久没有写C语言的程序了,对结构体这些方面的知识也忘记得差不多了,感觉写起来有点吃力,而且使用dev C++调试起来感觉有点困难,因为出现运行时错误的时候没有任何的错误信息在控制台上,所以只能够自己检查源程序来判断到底错误出现在哪里,下面是关于使用C语言创建一颗二叉树的例子,因为输入输出使用到了C++语法,所以需要引入C++的输入输出的头文件2. ① 类比于Java语言,Java语言...原创 2019-06-09 09:02:03 · 3432 阅读 · 0 评论 -
C语言实现邻接表的深度优先遍历
1. 对于图的遍历主要有两种遍历方式:深度优先遍历和广度优先遍历,对于图的遍历与树不同的是需要增加一个标记数组来对访问过的节点进行标记,假如访问过了我们就不能够再进行访问了2. 下面是使用C语言实现深度优先遍历的过程:①首先需要存储一个图,下面使用的是邻接表的方式来存储图(使用邻接表来存储图在我的上一篇博客有写:https://blog.csdn.net/qq_39445165/artic...原创 2019-06-17 20:39:35 · 9255 阅读 · 7 评论 -
C语言实现邻接表的广度优先搜索
1.对于图的遍历主要有两种遍历方式:深度优先遍历和广度优先遍历,对于图的遍历与树不同的是需要增加一个标记数组来对访问过的节点进行标记,假如访问过了我们就不能够再进行访问了2. 下面是使用C语言实现广度优先遍历的过程:①首先需要存储一个图,下面使用的是邻接表的方式来存储图(使用邻接表来存储图在我的上一篇博客有写:https://blog.csdn.net/qq_39445165/arti...原创 2019-06-17 22:00:04 · 1817 阅读 · 0 评论