双向链表结点
单链表的链式储存只有一个指示后继的指针域,所以,从某个结点出发只能顺指针往后寻查其他结点。若要寻查结点的直接前端,则需要从表头指针出发。
为了克服单链表的单向性缺点,在双向链表的结点中有两个指针域,一个指向直接后继,一个指向直接前趋。
typedef struct double_list
{
int val; //结点的值
struct double_list* next; //后继结点的指针域
struct double_list* pre;//前趋结点的指针域
}double_list;
双向链表初始化
首先malloc一个结点的空间,刚刚初始化的头节点,其前指针与后指针都赋值为空。
void inite(double_list** head)
{
*head = (double_list*)malloc(sizeof(double_list));
(*head)->next = NULL;
(*head)->pre = NULL;
}
这里有一个坑,为什么参数是二级指针?
因为结点中还有前后的指针域,所以如果传递一级指针,则出了函数作用域,前后指针还是会返回默认的随机地址。
双向链表的插入
当新结点插入到链表当中时,与单链表操作相同,只不过多了一个前趋指针的指向,先将新结点的后指针指向后一个结点,前指针指向前一个结点,再将后结点的前指针指向新结点,前结点的后指针指向新结点,即可完成插入