我们运用了单向链表来解决一些问题,但在解决那些需要大量查找前趋节点的问题是,单向链表无疑是不能用了,因为单向链表适合“从前往后”查找,并不适合“从后往前”查找。
如果要提高链表的查找效率,那双向链表(双链表)无疑是首选。
一:创建
line* initLine(line* h){
h = (line*)malloc(sizeof(line)); // 创建链表第一个结点
h->prior = NULL;
h->next = NULL;
h->data = 1;
line *l = h;
for(int i = 2; i <= 3; i++)
{
// 创建并初始化一个新结点
line *b = (line*)malloc(sizeof(line));
b->prior = NULL;
b->next = NULL;
b->data = i;
l->next = b; // 直接前结点的next指针指向新结点
b->prior = l; // 新结点指向直接前结点
l = l->next;
}
return h;
}
二:插入新节点
添加节点
添加节点可以分为三种,分别是:添加至表头、添加至链表的中间位置和添加至链表尾。
将新元素添加到表头:
假设定义新元素节点为t,表头节点为h,则只需要执行下面两个步骤和即可:
- t的next变成h,h的prior编程t;
- 将head移至tmp,重新指向新的表头。
添加至表的中间位置主要分为两个步骤:
- 新节点先与其后继节点建立关系;
- 新节点的前驱与之建立关系.
表未与添加至表头差不多:
- 找到双向链表的最后一个节点;
- 让新节点与其建立关系。
line* insertLine(line* h, int data, int add){
// 新建数据域为data的结点
line *t = (line*)malloc(sizeof(line));
t->data = data;
t->prior = NULL;
t->next = NULL;
if(add == 1)
{
t->next = h;
h->prior = t;
h = t;
}
else
{
line *b = h;
// 找到要插入位置的前一个结点
for(int i = 1; i < add - 1; i++)
{
b = b->next;
}
// 判断条件为真,说明插入位置为链表尾
if(b->next == NULL)
{
b->next = t;
t->prior = b;
}
else
{
b->next->prior = t;
t->next = b->next;
b->next = t;
t->prior = b;
}
}
return h;
}