📅  最后修改于: 2023-12-03 14:54:03.535000             🧑  作者: Mango
双向链表是一种常见的数据结构,它与单向链表相比,每个节点有两个指针,分别指向前一个节点和后一个节点。在双向链表中,每一个节点既可以快速找到前一个节点,也可以快速找到后一个节点。
双向链表中的排序插入,是指在已有序的双向链表中插入一个节点,并保证插入后链表仍然有序。
以下是基于 C 语言实现的带有头指针和尾指针的双向链表的排序插入代码片段:
typedef struct node {
int data;
struct node *prev;
struct node *next;
} Node;
// 初始化链表,设置头节点和尾节点
int initList(Node *head, Node *tail) {
head->prev = NULL;
head->next = tail;
tail->prev = head;
tail->next = NULL;
}
// 在双向链表中插入节点时,要遵循从小到大的顺序。
int insert(Node *head, Node *tail, int data) {
Node *p = (Node*)malloc(sizeof(Node));
if (p == NULL) {
return -1;
}
p->data = data;
p->prev = NULL;
p->next = NULL;
Node *temp = head->next;
while (temp != tail) {
if (temp->data > data) {
p->next = temp;
p->prev = temp->prev;
temp->prev->next = p;
temp->prev = p;
return 0;
}
temp = temp->next;
}
tail->prev->next = p;
p->prev = tail->prev;
tail->prev = p;
p->next = tail;
return 0;
}
说明:
typedef struct node { ... } Node;
定义了一个数据类型 Node
,它表示一个双向链表的节点。
initList()
函数用于初始化一个双向链表,参数为头节点和尾节点。
insert()
函数用于在双向链表中插入节点,它要遵循从小到大的顺序。如果插入成功,返回 0,否则返回 -1。
在 insert() 函数中,首先创建一个新节点,并初始化它的数据、前驱指针和后继指针。
然后从链表的头节点开始遍历链表,找到第一个比新节点大的节点。如果找到了,就把新节点插入这个节点的前面。如果遍历完整个链表都没有找到比新节点大的节点,就把新节点插入到链表的末尾。
在插入新节点时,需要修改新节点的前驱和后继节点的指针,使它们指向新节点。同时也要修改新节点的前驱节点和后继节点的指针,使它们指向新节点。
最后返回插入结果。
以上是带有头指针和尾指针的双向链表中的排序插入的代码片段,可以在实际工作中灵活应用。