【线性表】之队列
队列队列的概念队列只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的FIFO(First in First Out)。
入队列:进行插入操作的一端称为队尾。
出队列:进行删除操作的一端称为队头。
同样可以使用链表或者数组
数组:不是适合,队头出数据需要挪动数据。
链表:适合单链表,单链表头删效率很高。
结构定义123456789101112typedef int QueueDataType;typedef struct QueueNode{ struct QueueNode* next; QueueDataType data;}QueueNode;//单链表除了尾插还要尾删,所以不会加这个typedef struct Queue{ QueueNode* tail; QueueNode* head;}Queue;
初始化1234567//初始化void QueueInit(Queue* pq){ assert(pq); pq->tail = pq->head = NULL;} ...
【线性表】之栈
回顾顺序表和链表的区别和联系
顺序表:
优点:空间连续支持随机访问。
缺点:1.中间或前面的插入删除时间复杂度O(N)。
2.增容的代价比较大
链表(带头双向循环):
缺点:
以借点为单位存储,不支持随机访问。
优点:
1.任意位置插入删除时间复杂度为O(1)
2.没有增容消耗,按需申请结点空间,不用了直接释放。
栈栈也是线性表,在逻辑上还是挨着放的。
栈的概念以及结构
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
实现方式:
数组实现
总结:
相当于之前顺序表的尾插尾删,用尾做栈顶,非常合适,唯一缺陷就是,空间不够需要增容(影响不大)。
(顺序表——【线性表】之顺序表_半生瓜のbl ...
LeetCode刷题(5)【链表】环形链表II(C语言)
环形链表I
LeetCode刷题(3)【链表】【环形链表】&扩展_半生瓜のblog-CSDN博客
环形链表II
142. 环形链表 II - 力扣(LeetCode) (leetcode-cn.com)
这个题写起来不难,但是证明有点麻烦。
针对这个入口点怎么求,有人给出了一个结论。
结论:一个指针从meet点开始走,一个指针从链表的开始点走,它们会在入口点相遇。(看下面的过程的时候,先别想这个结论,否则会越来越乱的,就先当不知道。)
fast走的路程是slow走的路程的2倍。
slow走的路程:slow进环了以后,在一圈之内,fast一定会追上slow。因为slow走了一圈,fast都走两圈了。
slow进环之前,fast有可能在环里面转了N圈,如果入环之前的长度越长,环很小,N越大, 如果入环前的长度越短,环很大,N就是1,fast只转了1圈。
fast走的路程: L + C*N + X
slow走的路程:L + X
fast = 2*slow
L + C*N + X = 2(L +X)
化简一下得:
C* N - X = L
再化简一下得:(N-1)* ...
LeetCode刷题(4)移除元素&合并两个有序数组(C语言)
移除元素
典型双指针玩法。
27. 移除元素 - 力扣(LeetCode) (leetcode-cn.com)
我们都会想到这样的解法:从前面依次往后推,是val就将该数据后面的元素依次覆盖上来,但是这样的时间复杂度是O(n²),最坏的结果是一个数组中大部分数据都是val。
所以我们想到另一种解法,以空间换时间 ,另开一个数组,把不是val的数据给新的数组,再把新数组的值拷贝回来。空间复杂度是O(n)。
但是这个题它不让开辟一个新的数组,所以我们还得换一个思路。
该思路空间复杂度为O(n),时间复杂度为O(1)。——双指针解法
定义两个指针,p1和p2,p1先动,p2后动,如果p1不等于val,就把值传给p2,直到完成一遍遍历,p2的值就是新数组元素的个数。
如图所示:
123456789101112131415161718192021222324int removeElement(int* nums, int numsSize, int val){ int p1 = 0; int p2 = 0; //p1和p2都从数组左边出发 while(p ...
【线性表】之顺序表
线性表线性表(linear list)是n个具有相同特性元素的有限序列 。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串……
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
顺序表它是最简单的数据结构,也是最常用的数据结构——他的作用就是将数据存起来。
概念:顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表一般可分为:
1.静态顺序表:使用定长数据存储。
2.动态顺序表:使用动态开辟的数组存储。
下面的代码实现的是动态顺序表
结构定义1234567typedef int SeqListDataType;typedef struct SeqList{ SeqListDataType* arry;//指向动态开辟的数组 int size;//数组中有效数据的个数(在数组中说就是最后一个数据的下一个位置,因为数组下标是从0开始的) int capacity;//容量空间的大小 ...
【链表】单链表的实现
结构体定义123456typedef int SLTDataType;typedef struct SListNode{ SLTDataType data; struct SListNode* next;}SLTNode;
打印12345678910void SLTPrint(SLTNode* phead){ SLTNode* cur = phead; while (cur !=NULL) { printf("%d ", cur->data); cur = cur->next; } printf("\n");}
创建结点1234567SLTNode* SLTCreat(SLTDataType x){ SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode)); newnode->data = x; newnode->next = NULL; return newnode;}
尾插1234 ...
【链表】带头双向循环链表
单链表存在的缺陷:
不能从后往前走,
找不到他的前驱,
指定位置 删除 增加 尾删 都要找前一个,时间复杂度都是O(n)
针对上面的这些缺陷的解决方案——双向链表。
实际中要实现的链表的结构非常多样,以下情况组合起来就有8种链表结构:
单向、双向
带头、不带头——带哨兵位的头结点,这个结点不存储有效数据,好处是什么?尾插的判断更方便简单,带头就不需要二级指针了,(带头结点,不需要改变穿过来的指针,也就是意味着不需要传二级指针了。)
循环、非循环
无头单向非循环:结构简单,一般不会单独用来存数据,实际中更多是作为其他数据结构的子结构,如哈希桶,图的邻接表等,另外这种数据结构在笔试面试中出现很多。
带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头循环双向链表,另外,这个结构虽然复杂,但是使用代码代码实现的以后会发现结构带来许多优势,实现反而简单了。
带头双向循环链表
结构体创建结构体创建:
1234567typedef int LSTNodeData;typedef struct ListNode{ LSTNodeData ...
LeetCode刷题(3)【链表】环形链表(C语言)
环形链表
141. 环形链表 - 力扣(LeetCode) (leetcode-cn.com)
什么是链表带环:链表的最后一个元素不指向空而指向前面的某个结点。
思路:快慢指针,慢指针走一步,快指针走两步,二者先后 进入环内进行追逐,最终会在某个点相遇。
12345678910111213141516171819/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */bool hasCycle(struct ListNode *head) { struct ListNode* slow = head; struct ListNode* fast = head; while(fast && fast->next) { slow = slow->next; fast = fast->next-> ...
LeetCode刷题(2)【链表】合并链表&返回中间链表(C语言)
快慢指针问题:
思路:定义一个快指针和一个慢指针,快指针走到结束的时候,慢指针刚好走到一半。
链表的中间结点。
876. 链表的中间结点 - 力扣(LeetCode) (leetcode-cn.com)
12345678910111213141516171819/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* middleNode(struct ListNode* head){ struct ListNode* slow = head; struct ListNode* fast = head; while(fast != NULL && fast->next != NULL) { slow = slow-> ...
LeetCode刷题(1)【链表】反转链表(C语言)
题目链接——206. 反转链表 - 力扣(LeetCode) (leetcode-cn.com)**
反转链表
思路一:反转指针。
本质上就是调转指针的方向。
首先我们定义两个指针,一个叫n1,一个叫n2。(Node1,Node2)
让n2指向第一个结点,让n1指向空。
n2->next指向n1。
但是,两个指针是反不转的。因为:
这里让n2->next指向n1,就是把n1的值存到n2的next上,n2->next原来存的是2的地址,现在存的是NULL,但是继续往后走的时候,我们发现找不到2了 。
所以要反转指针,两个指针是反不动的,要用3个。
前两个指针 反转,最后一个指针负责记录下一个位置。
什么时候结束
n2 == NULL;
重复的条件用循环解决
初始条件
迭代过程
结束条件
画图看起来很浪费时间,但提升了写代码的体验,更好的解决问题。
代码实现:
12345678910111213141516171819202122232425262728293031/** * Definition for singly-linked list. ...
C语言实现学生成绩管理系统
相关视频——【C/C++课程设计】史上最全最详细的学生成绩管理系统上线啦,完成大学课程设计不是问题!_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
代码实现
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417 ...
C语言文件操作
相关视频——C语言精华——C语言文件操作,文件打开、关闭、读取、定位如何操作?为你逐一讲解文件操作标准库函数_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
文件分类:
一种是文本文件,一种是二进制文件。
文本文件:保存的时候,没一个字符对应一个字节。
二进制文件:按照二进制编码保存的文件。
文件操作:
打开文件 打开文件fopen(“文件路径”,”打开方式”)
参数:-(百度百科)
(选中函数按F1打开msdn文档)
打开文件成功返回一个文件指针,打不开返回 NULL。
123456789101112131415161718#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(void){ FILE* fp = fopen("C:\\Users\\XX\\Desktop\\test.txt","r"); if (fp == NULL) { printf("打开文件失败\n"); } char ch = ...
计算机二级考试公共基础知识部分——-数据库
相关视频——【极客学院】计算机等级考试二级c语言:公共基础知识部分(下)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
我的小站——[半生瓜のblog](半生瓜のblog (doraemon2.xyz))
现在是不是就只有河北和重庆还没考试了T_T。
数据库系统的基本概念
数据:描述事物的符号记录。
数据的特点:有一定的结构,有型与值之分,如整型、实型、字符型等。而数据的值给出了符合定性的值,如整形值15。
数据库(DB):是数据的集合,具有统一的结构形式并存放于统一的存储介质内,是多种应用数据的集成,并可被各个应用程序共享。
数据库存放数据是按 数据所提供的数据模式存放的,具有集成与共享的特点。
数据库管理系统(DBMS):一种系统软件,负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务等,是数据库的核心。
数据库管理系统的功能:
数据模式定义;
数据存取的物理构建;
数据操纵;
数据的完整性、安全性定义与检查;
数据的并发控制与故障恢复;
数据的服务:如拷贝、转存、重组、性能监测、分析等。
为了完成上述六个功能,数据库管理系统提供以下的数据语言:
数 ...
C语言的灵魂——-指针
相关视频——强烈推荐【强烈推荐】4小时彻底掌握C指针 - 顶尖程序员图文讲解 - UP主亲自翻译校对 (已完结)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
在学习这个之前,你需要了解函数、循环、数组等C语言知识
指针基本介绍
计算机的每一个字节都有一个地址。
int a,当代码运行的时候,计算机会在内存中开辟一些空间给a。分配多少空间,取决有具体的数据类型。
指针是一个变量,他存放这另一个变量的地址。
12345678#include<stdio.h>int main(void){ int a = 10;//定义一个整型变零a int* p;//定义一个指针变量p p = &a; return 0;}
p是一个指针变量,换句话说p是一个可以存放整型变量地址的变量。
&叫做取地址符,放在一个变量的前面,我们就得到了那个变量的地址,它返回一个指针,指向那个特定的变量。
*叫做解引用操作符,操作指针所指向的那个地址的内容(值)。
代码示例123456//下面的结果是什么?printf("%d\n ...
初识EasyX图形编程
相关视频——【C/C++/EasyX】学编程,做游戏,小白快速入门图形编程,零基础入门到精通,学习就是这么快乐_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
1.基本说明
EasyX是针对C++的图形库,可以帮助C/C++初学者快速上手图形和游戏编程。
比如 ,可以基于EasyX图形库很快用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块 、贪吃蛇、黑白棋等小游戏。
许多人学编程是从C语言入门的,而目前的现状是“
学校值只教基础语法,一直在黑窗口练习,同学们学的很乏味。、
即使有的学校教图形编程,也是使用一些难度较高的, 比如Win32,OpenlGl门槛依然很高,初学者容易收到打击。
开始引出我们的EasyX。
2.原理 基于Windows图形编程,将Windows下的复杂程序过程进行封装,将Windows下的编程过程隐藏,给用户提供一个简单熟悉的接口。用户对于图形库中函数的调用,最终都会由Windows的底层API实现。
3.安装
Easyx图形库支持Vs各种版本,下载解压后,直接执行安装程序即可。
头文件graphics.h
帮助文档Ea ...
QQ轰炸器
相关视频——【C/C++技术教程】QQ轰炸机(两种版本)!程序员带你实现腾讯QQ消息轰炸,瞬间99+让对面防不胜防!_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
注意:群体轰炸,当轰完(群发)完你所选中的分组后,它会继续往下进行,对下一个分组进行发送,连QQ的各种服务号都算上。
代码实现
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<Windows.h>//使用windows的资源int main(voi ...
C语言实现图书管理系统
相关视频——C语言课程设计实战:图书管理系统!计算机专业同学的一大难题,今天用代码实战演示,手把手带你完成!_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
1.前言在开始之前我们要解决三个问题。
指针如何变成变量
用变量的地址
1234int* p = NULL;int a = 1;p = &a;*p = 1001;
动态内存申请
12 p = (int*)malloc(sizeiof(int));*p = 10033;
什么是结构体?
就是一种类型,将几段内存组合成一段内存。
123456struct data{ int A; float B; char name[10];};
如何访问?
变量——.成员,
12struct data C;C.A = 1001;
指针——->,指针指向运算符,C->A
12struct data *sb = &C;sb->A = 1002;
什么是链表?
多个结构体变量链接在一起的线性结构。就是一个变量。
2.代码实现缺陷:
不包括用户信息
借出和 ...
C语言编写Web服务器
相关视频——C/C++技术教学:web 网络服务器开发!纯C语言手写web服务器,仅需 80 行代码,制作出你的专属服务器_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
端口
什么是端口?
物理端口:电脑网口、USB、看的见的接口。
虚拟端口:程序和网络进行通信的端口。
端口就好比一个房子的门,是初入这个房子的必经之路。
端口号
端口是通过端口号来标记的,端口号只有整数,范围是从0到65535。
(为什么最大是65535?)
端口号怎么分配的
端口号不是随意使用的,而是按照一定的规定进行分配。
知名端口
知名端口是众所周知的端口号,范围从0到1023,
80端口分配给HTTP服务,
21端口分配给FTP服务。
动态端口
动态端口的范围是从1024到65535,由操作系统进行分配。
之所以称为动态端口,是因为它一般不固定分配某种服务,而是动态分配。
动态分配是指当一个系统进程或应用程序进程需要网络通信时,
它向主机申请一个端口,主机从可用的端口号中分配一个供它使用。
当这个进程关闭时,同时也就释放啦它所占用的端口号。
Tcp服务器如同接电话的过程一样,在程 ...
认识各种图
相关视频——【C语言描述】《数据结构和算法》_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
相关书籍——《大话数据结构》
图按照有无方向分为无向图和有向图。
无向图由定点和边构成。
有向图由定点和弧构成,弧有弧尾和弧头之分。
如果任意两个顶点之间都存在边叫做完全图。
无向的叫做无向完全图。
有向的叫做有向完全图。
图按照边或弧的多少分为稀疏图和稠密图。
都是相对而言的多少。
若无重复的变到自身的边叫做简单图。
反例:下面这两个图都不是简单图。
图和顶点之间有邻接点、依附的概念。
无向图顶点的边数叫做度,有向图顶点分入度和出度。
(入度:有几个箭头指向这个顶点,出度:指向几个顶点。)
图上的边或弧上带权则称为网。
图中顶点间存在路径,两顶点存在路径则说明是连通的。
例如:由B到D在无向图上有四种不同的路径。
在有向图上由B到D有两种路径。
如果路径最终回到起始点则称为环,当中不重复叫简单环。
简单环
不是简单环,顶点C重复了。
若任意两顶点都是连通的,则图就是连通图。
不连通图
有向则称 ...
赫夫曼树及其应用
前言:
最基本的压缩编码方法——赫夫曼(huffman)编码。
在了解赫夫曼编码之前,我们必须了解一下赫夫曼树,赫夫曼编码就是基于赫夫曼树实现的。
相关视频——【C语言描述】《数据结构和算法》_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
相关书籍——《大话数据结构》
1.赫夫曼树的定义与原理
结点的路径长度
-从根节点到该结点的路径上的连接数。
数的路径长度
-树中每个叶子结点的路径长度之和。
结点带权路径长度
-结点的路径长度与结点权值的乘积。
树的带权路径长度(WPL)
-是树中所有叶子结点的带权路径长度之和。
(数结点间的连线相关的数叫做权,Weight)
其中:带权路径长度(WPL)最小的二叉树叫做赫夫曼树。
带权路径长度(WPL)的值越小,说明构造出来的二叉树性越优。
2.构造赫夫曼树的过程初识森林
在森林中选出两棵根节点的权值最小的二叉树,小的放左边,大的放右边。
合并两颗选出的二叉树,增加一个新结点作为新二叉树的根,权值为左右孩子的权值之和。
再从剩下的森林里面选出权值最小的二叉树,如果比第一次合并的结点权值小就放左边,反之 ...