链表的删除和预处理
- 软件开发
- 2025-08-05 00:21:02

创建空链表: struct Node head - - - 创建了头链表,内部不储存数据,地址为null,空间开在栈上(在main函数里创建新的节点,一般都开在堆上)。 函数不能返回局部变量的地址,因为局部变量的空间开在栈上,在函数运行完之后,空间销毁,所以只能返回一个值,不能是地址。
链表操作的复习: 1.创建空链表 2.插入链表 头插入/尾节点 3.链表的遍历 4.链表的长度 头删: free():释放掉malloc开出的空间,注意free不是将空间清零,而是将空间的使用权交给操作系统自由分配。 具体思路
void popFront(struct Node *head) { //1.p指针变量 指向首节点 //2.断开链表 head->next = p->next; //3.释放p所在的节点 free(p); } 尾删:
void void popBack(struct Node *head) { //1.p定位到尾节点的前一个节点 while (p->next->next != NULL) { p = p->next; } //2.释放 p->next //3.p所在节点成为了新的尾节点 p->next = NULL;
位运算
0 1 计算机 1Byte --存储单位 1Byte = 8bits
软件控制硬件
编程 -->CPU-->寄存器(位)--硬件关联
& : 一假则假 eg: int a = 0x33; a&0x55。 转为二进制分别为: 0011 0011 ; 0101 0101(一假则假) 得出:0001 0001 //x011
| :一真则真
~ ; 按位取反
^ 异或:相同为0;不同为一//同假真异
<< 左移: 数值<<位数 eg:a<<1 : 0010 0011 ----> 0100 0110(左移一位,对于十进制x10,对于16进制x2) 若是将a(0xff):1111 1111 第三位清零(从右往左,从0位开始)----- a & ~(1<<3)
>> 右移:数值>>位数 注意:看数据类型: 有符号位,右移 最高位补符号位 无符号位,右移最高位补0
预处理
#include #define N 10 预处理命令:, 都是以 # 开头的 10为值
编辑程序 --vi ,编译程序 --gcc ,运行文件
gcc的编译过程:
.c --- 机器代码 (0110)
预处理: 把程序中 # 开头的预处理命令 执行了 。形成 --预处理文件 --源代码文件 eg: gcc -E main.c -o main.i .i 文件 进行 下一步 :编译: // 编译成汇编文件 gcc -S main.i -o main.s 汇编 //将汇编文件 编译 成 目标文件(机器代码) gcc -c mian.s -o main.o 链接: 需要与用到相关库函数进行链接 ,生产最终可执行文件。 sqrt -lm (math)
预处理: 1.宏定义 2.头文件包含 3.条件编译 1.宏定义 (1).#define N 10 注意: a. 宏名 --标识符 符合标识符的定义规则。 一般写成大写。 b. 宏对应的值 是一个常量 N = 20; c. 只是做简单的文本的替换,不做计算 d. 宏的嵌套 e.最后不能写分号,因为分号也会作为宏值一部分,参与到文本的替换中 f.#undef 终止宏的定义 后面的代码不能再用这个宏 (2).带参的宏 形式: #define 宏名(参数) 宏值 宏展开的副作用(运算将值代入之后,考虑运算),能加括号的都加上 。
2.文件包含 #include <> ; #include "" 3.条件编译
eg: #include <stdio.h> <> //表示包含的文件,在编译器默认的搜索路径下 。 /usr/include
找的时候,直接到默认路径下寻找。
#include <test.txt> #include "/usr/include/test.txt" "" 先在当前目录下寻找,若没有再到默认目录下寻找。