数据结构——双向链表及makefile
在一项工程中,需要不仅仅是一个源文件,而是同时编译多个文件,这就需要makefile对工程进行编译和管理makefile:用来管理代码的编译和连接通过make工具解释makefile语法规则:目标文件:依赖文件(a.out:main.c)编译方法(gcc)
makefile
定义
在一项工程中,需要不仅仅是一个源文件,而是同时编译多个文件,这就需要makefile对工程进行编译和管理
makefile:用来管理代码的编译和连接
通过make工具解释
makefile语法规则:
目标文件:依赖文件(a.out:main.c)
编译方法(gcc)
创建文件:vi makefile或者vi Makefile,只有这两种
而在makefile中,则需要按如此方式
编写,然后再通过make进行编译,只需在终端打出make即可,当然还有简便方法,因为在makefile中可以定义变量
makefile中的变量
1,自定义变量,不需要具体的数据类型,只需要变量=数据即可,而引用变量需要用“$”符号
定义:
变量名 = 值
引用:
$(变量名)
例:

其中$(OBJ)就是a.out本身,所以可以按照上述方式来编写
clean:删除原先的a.out![]()
如果新编写了一个文件,想在原先的SRC后再加上一个文件,只需要SRC+=新文件名即可
2,系统变量
$^:所有依赖文件
$<:第一个依赖文件
$@:生成的目标文件
但是在使用系统变量之前,必须说明哪些文件是依赖文件,哪些文件是目标文件所以上图可以改为

如果在编译过程中需要用到其他头文件,可以通过-I来指定头文件所在位置,-L指定库所在位置,如下
时间戳
在编译代码时,值编译修改后的源文件,其他没有修改的,只进行链接即可
gcc编译的四个步骤
1,预处理:处理和#相关的指令,包括去掉注释,宏替换,头文件展开,特殊符号处理
gcc -E main.c -o main.i
2,编译:将源程序转换成汇编指令(C语言语法分析在该阶段执行)
gcc -S main.i -o main.s
3,汇编:将汇编指令生成二进制指令(可以执行,但不能直接执行)
gcc -c main.s -o main.o
4,链接:处理多文件及函数的链接关系,将所有.o链接为一个可直接执行的二进制文件(可执行程序)
gcc main.o -o app
1~3过程,每个文件独立处理,即n个.c文件会生成n个.o文件
双向链表
与单向链表的区别是,双向链表有两个指针域,可以指向指向本结点的结点,如图所示

创建双向链表


头插法

先判断是否为空指针,引入堆区空间,并将插入的数据放入堆区空间中,再判断是否为空链表,如果是空链表,则只需要将头节点指向该结点即可,如果不是,则需要将该结点的后继指向旧头节点
遍历

正反遍历,当dir==1时便正向遍历,反之则反向遍历
尾插

如果是空链表,则和头插相同,如果不是,则需要确定到尾结点,让尾结点指向该结点,该结点指向旧尾结点
头删

如果只有一个结点,则需要将链表对象指向NULL,如果不是,则链表对象指向新的头节点,释放旧头节点空间,并将新头节点指向旧头节点指向的结点
尾删

先确定尾结点,再将尾结点的前驱结点指向新尾结点,将新尾结点前驱指向旧尾结点前驱
销毁

反复调用头删
内核链表
内核链表:双向循环链表,不再将数据存储在链表结点中,而是将结点嵌入到存储的数据中
offset_of:获取内核链表中链表结点到结构体起始位置的偏移量
container_of:通过偏移量,获取结构体首地址(结点首地址-偏移量)
更多推荐



所有评论(0)