创建空链表:
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"
"" 先在当前目录下寻找,若没有再到默认目录下寻找。