📜  带有头指针和尾指针的双向链表中的排序插入(1)

📅  最后修改于: 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;
}

说明:

  1. typedef struct node { ... } Node; 定义了一个数据类型 Node,它表示一个双向链表的节点。

  2. initList() 函数用于初始化一个双向链表,参数为头节点和尾节点。

  3. insert() 函数用于在双向链表中插入节点,它要遵循从小到大的顺序。如果插入成功,返回 0,否则返回 -1。

  4. 在 insert() 函数中,首先创建一个新节点,并初始化它的数据、前驱指针和后继指针。

  5. 然后从链表的头节点开始遍历链表,找到第一个比新节点大的节点。如果找到了,就把新节点插入这个节点的前面。如果遍历完整个链表都没有找到比新节点大的节点,就把新节点插入到链表的末尾。

  6. 在插入新节点时,需要修改新节点的前驱和后继节点的指针,使它们指向新节点。同时也要修改新节点的前驱节点和后继节点的指针,使它们指向新节点。

  7. 最后返回插入结果。

以上是带有头指针和尾指针的双向链表中的排序插入的代码片段,可以在实际工作中灵活应用。