双向链表的insert问题:
- 如果insert一个Item,则需要先给他找到一个合适的位置。找到之后再分配空间,再把item加入到节点的储存item的空间中。
- 现在,就需要给新建的newnode设置指向。总共需要考虑4种情况:(1)为空链表(2)在链表的起始处(3)在链表的中间位置(4)在链表的末尾
- 要想成功insert新节点,需要改动四个指针。(1)newnode->fwd(2)new-node->bwd(3)current->next(4)next->bwd。
但是有两个指针的方向是确定的,跟新节点所在位置无关:newnode->fwd=next;current->fwd=newnode。 - 最后,分别依据current的指向和next的指向来判断是否为链表头或链表尾。由此来确定最后两个指针的指向。
- 总结:要修改的指针中,指向前的指针与insert位置无关。指向后的指针需要考虑insert位置。
#include<stdio.h>
#include<stdlib.h>
int
dll_insert(register Node* rootp, int value)
{
Node* current=rootp;
Node* next;
Node* newnode;
for (; (next=current->next)!= NULL; current =next)
{
if (next->value == value)
return -1;
if (next->value < value)
break;
}
newnode = (Node*)malloc(sizeof(Node));
newnode->value = value;
newnode->next = next;
current->next = next;
if (current != rootp)
newnode->bwd = current;
else
newnode->bwd = NULL;
if (next != NULL)
next->bwd = newnode;
else
rootp->bwd = newnode;
return 0;
}