- 博客(33)
- 收藏
- 关注

原创 寻找环形链表的入口点
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数来表示链表尾连接到链表中的位置(索引从 0 开始)。先定义一个节点:struct ListNode { int val; struct ListNode *next; };1.判断是否为环形链表寻找环形链表入口点的第一步,要先判断该链表是否为环形链表,环形链表的尾指针指向的位置是不确定的,可能指向首元素,这样的形成的链表环就是很大,也可能指向链表中间的随机元素
2021-04-13 16:44:45
3445
29
原创 进程通信--匿名管道和命名管道
通信的本质是传递数据,是相互的。进程之间不能“直接”相互传递数据,因为进程具有独立性,所有的数据操作都会发生写时拷贝,所以一定要通过媒介的方式来传播。什么是管道?管道是Unix最古老的进程间通信的形式,我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”。一.匿名管道供具有血缘关系的进程进行进程间通信,常见于父子进程。1.父进程创建管道以读方式打开一次,以写方式打开一次,文件描述符3,4就会指向同一个文件2.父进程fork出子进程子进程写时拷贝父进程3.父进程关闭fd[0],子进
2022-03-07 16:08:20
1201
原创 C++模板初阶--懒人创造世界
一·泛型编码泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。实现一个通用的交换函数void Swap(int& left, int& right){ int temp = left; left = right; right = temp;}void Swap(double& left, double& right){ double temp = left; left = right; right = temp;}v
2021-06-04 21:38:20
167
原创 C++的引用---李逵又称江湖“黑旋风”
C++中的引用一、引用的定义二、引用特性三、常引用一、引用的定义引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。比如说,李逵,在家称为"铁牛",江湖上人称"黑旋风”。类型& 引用变量名(对象名) = 引用实体;void TestRef(){ int a = 10; int& ra = a;//<====定义引用类型 printf("%p\n", &a); printf("%p\n"
2021-05-20 11:05:00
216
7
原创 8种面试经典排序详解--选择,插入,希尔,冒泡,堆排,3种快排及非递归,归并及非递归,计数(图+C语言代码+时间复杂度)
常见排序算法排序的概念1.排序:2.稳定性:3.内部排序:4.外部排序:一.直接插入排序二.希尔排序三.选择排序四.堆排序五.冒泡排序六.快速排序七.归并排序排序的概念1.排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。2.稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳
2021-05-17 20:36:04
1231
21
原创 设计循环队列--C语言
1.设计要求设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。你的实现应该支持如下操作:MyCircularQueue(k): 构造器,设置队列长度为 k 。Front: 从队首获取元素。如果队列为空,返回 -1 。Rear: 获取队尾元素。如果队列为空,返回 -1 。enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。deQueue(): 从循环队列中删除一个
2021-04-29 11:10:45
1104
5
原创 堆的实现---增,删,查,改,堆排序,TopK问题(自用)
堆排序1.堆的概念及结构2.堆的性质:3.堆的实现(1)堆调整向下算法(2)堆的创建(3)堆的销毁(4)堆的插入(5)堆的删除(6)取堆顶的数据(7)堆的数据个数(8)堆的判空(9)对数组进行堆排序1.堆的概念及结构如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,
2021-04-26 15:48:46
1078
9
原创 栈是不是栈,队列也不是队列---队列实现栈,栈实现队列
一、队列实现栈1.实现思路假设需要用栈存储1,2,3,4,则出栈顺序是4,3,2,1.用队列存储1,2,3,4直接出队是1,2,3,4.如果队列和栈中都只有一个数字,那么入栈出栈和入队出队就是一样的。我们使用两个队列来实现栈,队列q1和队列q2,起始两个队列都为空,我们将n个元素存入任何一个都可以,我们存入q1并且以1,2,3,4的方式一次入队。现在我们将前n-1个数字出队并依次存入q2中,此时q1中只剩下1个元素并且是刚刚入队时的最后一个元素,把这个元素直接出队,此时出队以后q1为空。在将
2021-04-21 20:52:02
378
2
原创 栈和队列基本操作--出,入,获取,检测,销毁
栈和队列1.栈的定义2.栈的增删查改(1)初始化栈(2)入栈(3)出栈(4)获取栈顶元素(5)获取栈中有效元素个数(6)检测栈是否为空,如果为空返回非零结果,如果不为空返回0(7)销毁栈3.相关练习1.栈的定义栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做
2021-04-20 16:17:46
1159
原创 删除链表重复结点,重复结点不保留
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5解题思路先定义三个结点:struct ListNode* prev=NULL;struct ListNode* cur=phead;struct ListNode* next=phead->next;当cur和next不相等时,prev,cur ,next都向前
2021-04-17 17:10:07
478
原创 复制带随机指针的链表
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。例如:构造这个链表的深拷贝。 深拷贝应该正好由 n 个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random -> Y ,那么在复制
2021-04-14 16:03:15
130
4
原创 将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序
题目描述:现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。输入:2 4 9 3 2 1 6,x=5输出:2 4 9 3 2 1 6思路:遍历链表,依次拿链表的每个节点的val和x对比,开辟两个新的链表,将小于x的节点存入一个链表,将大于或者等于的节点存入另一个链表,最后将大的链表的头节点接入小的链表的尾部。代码实现如下:struct ListNode* partition(str
2021-04-12 16:19:10
921
原创 数据结构基础--链表
什么是链表链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。无头+单向+非循环链表增删查改实现链表的初始化typedef int SLTDateType;typedef struct SListNode{ SLTDateType data; struct SListNode* next;}SListNode;动态申请一个新的节点SListNode* BuySListNode(SLTDateType x)// 动态申请一个节点{
2021-04-08 10:23:12
136
原创 数据结构基础--顺序表
顺性表是什么顺序表是线性表的的一种。线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。以下是对顺序表的初始化,删除,增删查改顺序表初始化void SeqListInit(SeqList* pq){ assert(pq); pq->a = NULL; pq->si
2021-04-03 16:56:19
349
原创 宏和函数的区别
比较两个数的大小方法一:用函数来写int Add(int x,int b){ return a>b?a:b;}方法二:用宏的定义来写#define MAX(a, b) ((a)>(b)?(a):(b)) 命名约定一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。 那我们平时的一个习惯是:把宏名全部大写 函数名不要全部大写宏和函数的对比1.代码长度#define定义宏:每次使用时,宏代码都会被插入到程序中。除了非常小的宏之外,程序的长度
2021-03-19 22:58:27
431
2
原创 文件操作(文件的读写顺序)
文件类型根据数据的组织形式,数据文件被称为文本文件或者二进制文件。(1)数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。(2)如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。文件的读写顺序读文件之前打开文件代码:int main(){ FILE* pf = fopen("data.txt", "r"); if (pf == NULL) { printf("%s\n", strerror(err
2021-03-14 22:06:17
741
4
原创 动态内存管理的四个经典面试题
例题1:void GetMemory(char *p){ p = (char *)malloc(100);}void Test(void){ char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str);}答:无法正常运行因为GetMemory接收的是str,p是形参只是实参str的一份临时拷贝,所以给形参p开辟空间对于实参str没有影响,但由于 malloc开辟的空间没有被free释放,所以开
2021-03-13 15:49:12
124
原创 C语言实现通讯录的动态空间
实现一个通讯录;通讯录可以用来存储DEFAULT_SZ个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法:1.添加联系人信息2.删除指定联系人信息3.查找指定联系人信息4.修改指定联系人信息5.显示所有联系人信息6.清空所有联系人7.以名字排序所有联系人8.销毁通讯录与上一篇C语言实现通讯录相比,通讯录的最大容量1000改到了DEFAULT_SZ个(DEFAULT_SZ可自定义,根据所需要的联系人大小进行更改)。将通讯录的初始化和通讯录增加元素模块进行了更改,并且增加了
2021-03-13 14:53:54
811
原创 C语言简单实现通讯录
实现一个通讯录;通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法:1.添加联系人信息2.删除指定联系人信息3.查找指定联系人信息4.修改指定联系人信息5.显示所有联系人信息6.清空所有联系人7.以名字排序所有联系人头文件:contact.h#include <stdio.h>#include <string.h>#define MAX 1000#define MAX_NAME 20#define MAX_S
2021-03-10 09:36:44
447
原创 C语言结构体中的位段
C语言结构体中的位段位段的内存分配位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。例题:解析:位段的跨平台问题int 位段被当成有符号数还是无符号数是不确定的。位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会
2021-03-07 21:19:33
430
原创 C语言中部分库函数的模拟实现
头文件的统一使用这三个#include <stdio.h>#include <assert.h>#include <string.h>strct的作用是将一个字符串接到另一个字符串的后面//模拟实现strcatchar* my_strcat(char* dest, const char* src){ assert(dest && src); char* ret = dest; while (*dest) { dest++; }
2021-02-09 20:48:09
155
原创 关于简单大小端存储
//判断电脑为大端存储还是小端存储int check_sys(){ int a = 1; char* p = (char*)&a; //或return *(char*)&a; return *p;}int main(){ if (check_sys() == 1) { printf("小端"); } else printf("大端");}电脑中的数据存储有大端字节序存储和小端字节序存储。大端字节序存储:把一个数的低位字节的内容,存放在高地址处;高位
2021-02-01 01:31:56
147
原创 C语言写扫雷小游戏
C语言写扫雷小游戏:头文件:#include <stdio.h>#include <time.h>#include <stdlib.h>#define EASY_COUNT 10#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2//初始化棋盘void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
2021-01-25 16:42:36
127
原创 C语言实现三子棋
C语言实现三子棋#include “game.h”三子棋为3*3的数组,将其初始化为空格:void InitBoard(char board[ROW][COL], int row, int col){int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ’ ';}}}打印表盘:void DisplayBoard(char board[ROW][CO
2021-01-24 23:28:54
181
1
原创 C语言完成字母的大小写转化
//完成字母大小写转换,有一个字符,判断它是否为大写字母,如果是,将它转换成小写字母;反之则转换为大写字母。#include <stdio.h>int main(){char zimu=0;while (scanf_s("%c",&zimu)){if (zimu >= ‘a’ && zimu <= ‘z’){printf("%c\n", zimu - 32);}else if (zimu >= ‘A’ && zim
2021-01-19 23:34:46
432
原创 C语言完成简单猜数字游戏
//猜数字游戏#include <stdio.h>#include <stdlib.h>#include <time.h>void menu(){printf("**************\n");printf(" 1.play \n");printf(" 0.exit \n");printf("**************\n");}//TDD-测试驱动开发//RAND_MAX–rand函数能返回随机数的最大值void game()
2021-01-19 20:08:01
157
原创 C语言中static的作用
static作用于局部变量时,局部变量的生命周期会变成长,但是作用域不变。static作用于全局变量或者函数时,(用extern来声明外部符号)改变了他们的链接属性,编译后显示无法解析外部符号。...
2021-01-14 22:17:44
91
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人