通用链表
通用链表前言我们之前写的链表在进行插入操作的时候,数据域中存储的数据我们都是在链表插入函数llist_insert中创建的,这肯定不符合常理。如果用这样一个链表写一个管理系统,每次用户想要插入数据还要自己打开源代码修改吗?
而且还有一个致命的地方,就是我们创建的节点数据域中数据的个数用户也无法进行更改,所以之前写的链表在一些情景下是无法使用的,所以我们需要创建一个通用性强的链表。
通用链表和普通链表什么是通用性强的链表呢,通过上面问题的阐述,插入节点的数据应该是由用户创建。用户还可以随时增加或减少数据的类型和个数。
数据节点以有头双向循环链表为例,我们的通用链表也要创建为双向循环的,因为我们要保证我们创建出的链表通用性要强(说的废话😂)。先来看看我们之前写的普通链表,是用LLIST作为链表的节点进行操作的
12345678typedef struct llist_node{ int id; char name[NAMESIZE]; int math; struct llist_node *prev; struct llist_node *next;}LLIST;
...
链表
链表链表是一种线性存储结构,常见的线性表有顺序表和链表,线性表中,数组是最常见的结构。而链表和数组不同的地方在于,链表在物理存储单元上是一种非连续的数据结构。从名字看就能知道,链表类似链式的结构,相当于一群人手牵手。对于链表的分类,通过是否有头节点,分为有头链表和无头链表;通过链表的遍历方向,分为单向链表和双向链表;通过是否首尾相连,非为循环链表和不循环链表
单链表有头链表是看链表是否有头节点,而头节点只是做为链表开始的标志,为链表的增删改查服务的节点。头节点和链表其余节点的组成都是一样的,分为数据域和指针域,其中分别存的是数据和后一节点的地址。有头链表的第一个头节点的数据域是空的,我们只需要用到他的指针域。
无头的单向不循环链表就更好理解了,原来链表头节点是不存储数据的,只指向下一节点,而我们直接拿有数据的第一个节点当作头节点当然也是可以的。
单链表的增删前面说链表和数组都是属于线性表,但是获取链表种节点数据的方式却不同与数组。数组的存储空间是连续的,我们想要获取数组中的数据,可以使用数组下标[]的方式很方便的获取。因为存储空间连续的原因,我们通过下标这种语法糖的形式对数组成员地 ...
C语言奇怪的声明
指针常量-常量指针、指针数组-数组指针、指针函数-函数指针、函数指针函数到底是些啥?
C语言奇怪的声明前言
指针常量-常量指针、指针数组-数组指针、指针函数-函数指针、函数指针函数
听完老师讲后知道了辨别的方法——后两个字就是它的本质,听了这句话,我的嘴角露出了轻蔑的笑容,就这?
直到我看见了这些题目
123456789101112131415a) 一个整型数(An integer)b) 一个指向整型数的指针(A pointer to an integer)c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)d) 一个有10个整型数的数组(An array of 10 integers)e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A ...
C语言内存分区
C语言会把内存空间分为5大区:栈区、堆区、全局区、常量区、代码区
C语言内存分区C语言内存空间5大区C语言会把内存空间分为5大区:正文段、初始化的数据段(.data)、未初始化的数据段(.bass)、栈和堆
栈区(stack)栈区由编译器自动分配释放,由操作系统自动管理,无须手动管理。栈区上的内容只在函数范围内存在,当函数运行结束,这些内容也会自动被销毁。
栈区按内存地址由高到低方向生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。
栈区是先进后出原则,即先进去的被堵在屋里的最里面,后进去的在门口,释放的时候门口的先出去。
堆区(heap)堆区由程序员分配内存和释放。
堆区按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。
堆区动态申请与释放内存用malloc(),free()等函数实现动态分布内存。
1void *malloc(size_t);
参数size_t是分配的字节大小;
返回值是一个void*型的指针,该指针指向分配空间的首地址;(void *型指针可以任意转换为其他类型的指针)
用free()函 ...
排序算法
目前更新3种排序算法
排序算法前言没想到嵌入式C语言课程进行的这么快,开始讲到排序的算法了,老朋友又来了😂。在学习Java的时候排序算法也只是讲了一下,这次嵌入式学习这点却很重要(毕竟不是包装哈哈🤓)。不过感觉进度上来,提前预习那点东西也快没用了,快没什么装逼的资本了。之后的数据结构也看的断断续续,一周多链表还没看完,为了以后能依旧展现装逼风采,立个flag🚩月底结束线性表、栈与队列!这次排序算法的总结就做为一个良好的开始吧😆
冒泡排序冒泡排序!话不多说直接上图
123456789101112131415161718192021222324252627282930313233343536373839#include <stdio.h>void swap(int arr[], int i, int j){ //使用位运算进行数值交换 arr[i] ^= arr[j]; arr[j] ^= arr[i]; arr[i] ^= arr[j];}void output(int arr[], int size){ ...
C语言基础(3)-指针
未更新完
C语言基础(3)-指针指针的含义
指针是用来干什么的?
指针就是用来存储地址的
变量就是用来存储数据的
指针就是用来存储地址的
数据和地址会以二进制补码形式存储在内存中,数据在内存中会有负数形式,地址没有负的,地址一般是以十六进制的形式展现
指针的定义1234567/*数据类型 变量名;*/ char c; int i; float f; char* pc; int* pi; float* pf;
通过sizeof测试指针的数据类型大小1234567891011121314151617181920int main(){ printf("sizeof(void *) = %ld\n", sizeof(void *)); printf("sizeof(char *) = %ld\n", sizeof(char *)); printf("sizeof(short *) = %ld\n", sizeof(short *)); printf("sizeof(int *) = %ld\n" ...
C语言基础(2)
I/O操作、控制语句
C语言基础(2)输入输出(I/O操作)格式化输入输出scanf printfprintf("%[修饰符]格式字符",输出表项);基本输出格式字符如下:
字符输入输出getchar putchar字符串输入输出gets puts控制语句分支语句循环语句for循环for是C语言的关键字for循环的执行流程
123456语句1for(循环变量的赋值; 循环变量的控制; 循环变量的变化){ 循环的语句}语句2
for循环的变形
死循环
12for(; ;);for(表达式1; ;表达式2) /等价于/for(表达式1; 1; 表达式2)
在一个循环中存在多个循环变量多条件需要使用逻辑运算符进行连接
12int i = 0, j = 0;for(i = 0, j < 10; i < 10 && j >= 0; i++, j--)
嵌套循环嵌套循环可以解决类似穷举和平面图像打印的问题
12345678int i = 0, j = 0;for(i = 0; i < 5; i++) ...
C语言基础(1)
C语言基础(1)前言C语言特点
基础性的语言
语法简洁、紧凑、方便、灵活
运算符丰富,数据结构丰富
结构化、模块化编程
移植性号,执行效率高
允许直接对硬件操作
C语言学习要点:
概念的正确性
动手能力
阅读优秀的程序段
大量练习,面试题
C语言讲解流程
基本概念
数据类型,运算符和表达式
输入输出专题
流程控制
数组
指针
函数
构造类型
动态内存管理
调试工具和调试技巧(gdb,make)
常用库函数(提前封装好的工具函数)
使用平台64位Redhat6、编辑器vim、编译器gcc(make)
gcc、vim12345678910111213141516//头文件的包含#include <stdio.h>//printf在stdio库当中#include <stdlib.h>//exit在stdlib库当中/*void main(void)//不传参void main(int argc,char **argv)//char *argv[]int main(int argc,char **argv)*/int main(){ ...
Linux基础(4)
Linux基础(4)文件权限管理文件权限的介绍在Linux环境中任何的文件都是有权限的,文件的权限可以分为基本权限和特殊权限
基本权限
rwx—-文件所属者 r-x—-文件所属组 r-x—-其他用户
符号
数字
含义
对于普通文件的影响
对于目录文件的影响
r
4
可读
是否可以读取文件内容
是否可以列出目录的子文件
w
2
可写
是否可以修改文件内容
是否可以创建或删除子文件
x
1
可执行
是否可以执行文件内容
是否可以访问该目录
-
0
该处无权限
/
/
修改权限sudo chmod 权限 文件名 用来修改文件权限的
sudo chmod 664 文件名
sudo chown 用户名.组名 文件名 用来修改属者属组sudo chown 用户名 文件名 用来修改属者sudo chown .组名 文件名 用来修改属组
特殊权限文件的特殊权限分为三种suid sgid sticky
无论是哪种特殊权 ...
Linux基础(3)
Linux基础(3)写程序的阶段
只写一个.c文件,在.c文件中写一个函数(main函数),把所有功能都推到main函数中
只写一个.c文件,在.c文件中除了main函数以外还有其他的功能函数
多文件的形式写项目main.c 存放的是主函数和功能函数的调用func.c 存放的是功能函数的实现func.h 存放的是功能函数的声明以及各种定义makefile 脚本文件,存放的是一些编译规则
可以把.c文件做成库文件(静态库和动态库)
Linux的编辑器和编译器编辑器(编写程序)在Linux环境中有很多vi vim gedit emacs,我们主要使用vim
在命令模式下的操作光标的定位h(向左) j(向下) k(向上) l(向右)
命令
作用
gg
光标回到首行
G
光标回到末行
23G
快速定位到第23行
/关键字
光标定位到出现关键字的位置(n从上往下查找,N从下往上查找)
文本的编辑
命令
作用
yy
复制(把光标所在行的内容进行复制)
p
粘贴(粘贴到光标所在行的下边)
...