数据结构——双向链表及makefile
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,编译:将源程序转换成汇编指令 gcc -S main.i -o main.s
3,汇编:将汇编指令生成二进制指令 gcc -c main.s -o main.o
4,链接:处理多文件及函数的链接关系 gcc main.o -o app
双向链表
与单向链表的区别是,双向链表有两个指针域,可以指向指向本结点的结点,如图所示
创建双向链表
头插法
先判断是否为空指针,引入堆区空间,并将插入的数据放入堆区空间中,再判断是否为空链表,如果是空链表,则只需要将头节点指向该结点即可,如果不是,则需要将该结点的后继指向旧头节点
遍历
正反遍历,当dir==1时便正向遍历,反之则反向遍历
尾插
如果是空链表,则和头插相同,如果不是,则需要确定到尾结点,让尾结点指向该结点,该结点指向旧尾结点
头删
如果只有一个结点,则需要将链表对象指向NULL,如果不是,则链表对象指向新的头节点,释放旧头节点空间,并将新头节点指向旧头节点指向的结点
尾删
先确定尾结点,再将尾结点的前驱结点指向新尾结点,将新尾结点前驱指向旧尾结点前驱
销毁
反复调用头删