
C语言
文章平均质量分 67
Nemoxy
咸鱼一条,希望自己写的东西能给大家带来帮助~
展开
-
2021-08-31 C++: 虚继承下array new / delete 的内存管理
以下实验基于VS2015, win32环境array new出来的对象,能否用父类指针能否调用子类虚函数?如果父类大小 * 元素数目 = 子类大小 * 元素数目,就可以,否则不行。#include "stdafx.h"#include <iostream>using namespace std;class A {public: int x{ 10 }; virtual void PrintVal(int a = 1) { cout << x + a <&l原创 2022-04-27 14:41:27 · 2081 阅读 · 0 评论 -
C语言:顺序表、链表、队列、栈 及基本操作
顺序表#include <stdio.h>#include <stdlib.h>#include <time.h>typedef struct Vector{ int *data; int size, length;}Vector;Vector *init(int n){ Vector *vec = (Vector *)malloc(sizeof(Vector)); vec->data = (int *)malloc(sizeof(int)原创 2020-12-04 20:57:19 · 293 阅读 · 0 评论 -
C语言:森林与并查集
两种考察连通性的算法:Quick_find算法:将所有元素的代表元素设为后面merge的元素,最后会呈现出表格中有几个元素就有几类的情况,但每次更新权值都要进行所有元素的搜索,很慢。Quick_union算法:将每个集合的代表元素改成一样的,比如2->1,那么将2与3并时,只需将1->3。判断是否属于一个集合需要递归找到自己就是代表元素的节点,就是这个集合的根结点,此时也是,有几个集合就有几个树。Quick_union优化:根据权值(子节点数量)决定谁是爸爸路径压缩:在搜索代表节原创 2020-12-02 00:50:20 · 266 阅读 · 0 评论 -
C语言:非稳定排序(选排,快排)
稳定与非稳定的定义可以参照前一博文(稳定排序)插入排序:将已排序区设在数组首部,遍历待交换区找最值,交换到待交换区首/已排序区末。由于是直接交换,是非稳的。快速排序:与归并一样,用的是分治的思想。大致思路是,选数组首元素为基准值,然后使数组首/左指针与尾/右指针相向移动,将比基准值大的元素移到左指针右边,比基准值小的移到右指针左边,可以保证左右指针相交处,右边都比基准值大,左边都比基准值小。(先是左指针左边一定小,右指针右边一定大,逐步逼近相交情况,这样能进行最少次数交换,找到 小-基准值-大 情况)原创 2020-12-01 01:05:31 · 350 阅读 · 0 评论 -
C语言:稳定排序(冒泡,插排,归并)
什么叫稳定排序呢?比如排序中有两个一摸一样的数字,如果排完序,两个相同的数字顺序没有改变,就是稳定的, 反之,就是非稳定的。稳定排序包括:冒泡:插入:不断地将待排序区数字加入到已排序区,直到待排序区没有元素,【有点像插队;O(n^2)归并另外,排序算法还能分为: 内部排序、外部排序(当前数组不可以全部加载到内存中,需要分段加载)...原创 2020-11-30 22:06:18 · 737 阅读 · 0 评论 -
C语言基础数据结构:二叉树及与广义表的转换
二叉树建立与广义表输出#include <stdio.h>#include <stdlib.h>#include <time.h>typedef struct Node{ int data; struct Node *lchild, *rchild;}Node;typedef struct Tree{ Node *root; int n;//节点个数?}Tree;Node *init_node(int val){ Node *p = (No原创 2020-11-30 15:39:24 · 877 阅读 · 0 评论 -
面试笔试算法:广搜
难得的休息日,小明起床时就已经 11 点多了,他常去的馅饼店一般 12 点就没饭了,他需要赶紧洗漱,出门,然后去馅饼店吃饭,到了小区大门口他傻眼了,前几天贴的修路公告成为了现实,现在小区门外已经成为工地,到处都是路障。小区门口到馅饼店的路形如一个 n×m 的二维矩阵,能走的道路被标记成了 .,路障被标记成了 #,小区大门被标记成了 2,馅饼店被标记成了 3,小明可以在矩阵上上下左右移动,每移动一次代表走了一步,现求小明从小区门口最少走多少步才能到达馅饼店,若无法到达则输出 −1。...原创 2020-11-29 17:39:53 · 181 阅读 · 0 评论 -
面试笔试算法:深搜
由数字 0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 1 构成,围圈时只走上下左右 4 个方向。现要求把闭合圈内的所有空间都填写成 2。例如:6×6 的方阵 (n=6),涂色前和涂色后的方阵如下:#include <iostream>using namespace std;//预留出一圈,并将外圈连通的区域标记为2,那么剩下的为0区域则是要求区域int n;int mmap[100][100];int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0原创 2020-11-27 23:25:35 · 731 阅读 · 0 评论 -
C语言:堆与完全二叉树与优先队列
堆与完全二叉树区别:堆分为大顶堆和小顶堆,即在满足完全二叉树的条件下,还要满足(根,左孩子, 右孩子)这个三元组始终满足根最大or最小的性质。接下来,以大顶堆为例,阐述关于堆的一些操作:查找最值:根始终为最大值,根的左右孩子中一定有第二大值,但第三大值就不确定了;插入值:首先为了满足完全二叉树的结构,将值添加在最后面,然后沿着该节点到根的这条路劲上,以从小到大的原则,进行换位调整(有点冒泡的意思),直到整条路径上的元素为有序的;弹出值:将栈顶弹出(类似队列),然后为了维护完全二叉树节构,将树最后元素原创 2020-11-08 20:56:17 · 228 阅读 · 0 评论 -
C语言:Hash表查找字符串内容
#include <stdio.h>#include <stdlib.h>#include <string.h>//拉链法//链表节点,数据域存字符串typedef struct Node{ char *str; struct Node *next;}Node;//顺序表(表头,大小)typedef struct HashTable{ //链表首地址,是链表头结点的顺序表,由于头结点是Node *,顺序表示Node ** Node **data原创 2020-11-08 17:02:25 · 3000 阅读 · 2 评论 -
C语言:欧几里得算法 or 辗转相除法
求最大公约数#include <stdio.h>#include <math.h>int grd(int a, int b){ return (b ? grd(b, a % b) : a);//取余为0则返回前一个数,否则返回递归}int main() { setvbuf(stdout, NULL, _IONBF, 0);//eclipce读写缓冲区问题 int a, b; while(~scanf("%d %d", &a, &b))原创 2020-10-25 19:02:55 · 491 阅读 · 0 评论 -
C语言:工程规范(头文件,makefile)
程序源文件//main.c#include <stdio.h>#include <t1.h>int main(){ printf("%d\n", add(1, 3)); return 0;}//t1.h#ifndef _T1_H#define _T1_Hint add(int, int);#endif//t1.cc#include<stdio.h>#include <t1.h>int add(int a,原创 2020-10-18 01:09:40 · 489 阅读 · 0 评论 -
C语言:源文件 头文件【.c/.cc/.h】的使用
一个函数包括定义与声明,定义中包含了函数是如何实现的,声明则阐明函数如何被调用。工程上为了将个函数模块化,通常将声明与定义分开,一般将主函数定义放在.c中,其他函数定义放在源文件.cc中,函数声明放在.h中。.c 中包含主函数,并include所有使用到的头文件;.cc中包含其他函数定义,并include需要的.h文件或需要的非本函数的声明;【保证这个源文件可以单独编译成功如果不将函数的声明与定义分开,将函数声明和定义都放在.c中,那如果现在要增加一个函数的声明文件2.c,这个新函数include其原创 2020-10-13 21:34:26 · 3037 阅读 · 0 评论 -
C语言:数组操作【素数/线性筛、二分查找】
arr代表数组首地址,type arr[n]将在内存中开辟一块连续的nsizeof(type)存储空间,arr + 1代表在原来地址基础上偏移1个type类型地址大小,32位sys中就是32位,同理64位。在函数内部建数组,是在栈区,不赋初始值可能会有奇怪的数字;而在函数外,则变量默认在堆区开辟空间,自动进行初始化操作【都为0】。栈区默认8MB【约可存储2百万个整形变量,8102410248/32 ~=2097152】,大于200万的变量数最好开在堆区。函数与数组有一定类似性,数组也可以理解为下标与值的原创 2020-10-13 16:02:51 · 315 阅读 · 0 评论 -
C语言:函数的声明与定义
函数的声明函数名称,类型,参数列表报undeclared错误计算机只考虑如何使用函数函数定义具体实现的逻辑报undefined错误计算机考虑函数如何实现当重复定义,报duplicated错误,因为计算机不知道你要用哪个定义。.c为源文件,先经过预编译,将头文件展开生成相应代码,接下来开始编译,生成对象文件.o,然后对所有对象文件链接打包,生成可执行程序.out函数未声明错误发生在编译阶段,此时进行语法检测,而函数未定义错误发生在链接阶段。仅生成对象文件:gcc -c xxx.c文件原创 2020-10-05 15:08:26 · 674 阅读 · 0 评论 -
二叉树专题
反转二叉树有一个问题,若没有node->lchild = reverse(node->lchild);而是直接reverse(node->lchild);就会宝座#include<iostream>#include<string>using std::cin;using std::cout;using std::endl;using std::string;class Node {public: char data; Node *l原创 2020-09-19 18:05:43 · 105 阅读 · 0 评论 -
C++:二叉树及相关操作
#include<iostream>using std::cout;using std::endl;class Node {public: int data; Node *lchild, *rchild; Node(int _data) { data = _data; lchild = NULL; rchild = NULL; } ~Node() { if (lchild != NUL原创 2020-09-19 00:55:49 · 230 阅读 · 1 评论 -
C语言:输入输出
这期主要讲printf 和scanf 族类函数。首先,这两个函数都是有返回值的,printf函数返回成功输出的字符个数,scanf函数返回成功接收的参数个数,如果接收到Ctrl + z, 代表文件末尾EOF, 返回-1。#include<iostream>int main(){ setvbuf(stdout,NULL,_IONBF,0);//针对Eclipse_for_C输出顺序问题,将缓存区空间设为0. printf("一共输出了%d个字符\n", printf("123 456\原创 2020-09-17 01:12:55 · 673 阅读 · 0 评论 -
C++ 栈的相关操作
栈#include<iostream>#include<string>#include<cassert>using std::cin;using std::cout;using std::endl;using std::string;template<typename Type> class Stack {private: Type *elements; int max_size, top_index;public:原创 2020-09-12 16:56:05 · 270 阅读 · 0 评论 -
C++队列*增删查等操作*
队列#include <iostream>using std::cout;using std::endl;template <typename Type> class Queue {private: Type *data; int head, tail, length;public: Queue(int length_input) { data = new Type[length_input]; length = l原创 2020-09-11 15:24:03 · 1216 阅读 · 0 评论 -
C++顺序表、链表的*插删查等*操作
顺序表#include <iostream>#include <cstring>using std::cout;using std::endl;//定义顺序表模板类template <typename Type> class Vector {private: int size, length; Type *data;public: Vector(int input_size) { size = input_size;原创 2020-09-09 18:09:55 · 272 阅读 · 0 评论 -
C语言:关于字符串操作感悟
由于C没有像C++或者Java或者。。。的各种花样繁多的字符串操作函数。而仅有屈指可数的几种函数:函数名功能strlen(s1)返回字符串s1长度,而非这个变量占用空间的大小,那个是sizeof())strcpy(s1,s2)复制字符串 s2 到字符串 s1strcat(s1, s2);连接字符串 s2 到字符串 s1 的末尾其他的函数先暂时用不到,用...原创 2019-12-15 17:49:42 · 383 阅读 · 0 评论