跳到主要内容

双向链表的p所指结点之后插入s所指结点的代码?

参考答案:

在双向链表中,每个节点通常包含两个指针:一个指向前一个节点,另一个指向后一个节点。在插入一个节点时,你需要更新四个指针:新节点的前一个节点的后指针,新节点的后一个节点的前指针,新节点的前指针,以及新节点的后指针。

以下是一个C语言的示例,展示如何在双向链表的节点p之后插入节点s:

#include <stdio.h>
#include <stdlib.h>

// 定义双向链表节点结构体
typedef struct Node {
    int data;
    struct Node* prev;
    struct Node* next;
} Node;

// 双向链表插入节点的函数
void insertAfter(Node* p, Node* s) {
    if (p == NULL) {
        printf("节点p为空,不能插入新节点。\n");
        return;
    }

    // 设置s的前一个节点为p
    s->prev = p;

    // 设置s的后一个节点为p的后一个节点
    s->next = p->next;

    // 如果p之后有节点,将p之后节点的前一个节点设置为s
    if (p->next != NULL) {
        p->next->prev = s;
    }

    // 设置p的后一个节点为s
    p->next = s;
}

// 主函数,用于测试
int main() {
    // 创建节点p和s
    Node* p = (Node*)malloc(sizeof(Node));
    Node* s = (Node*)malloc(sizeof(Node));

    // 初始化节点数据
    p->data = 1;
    s->data = 2;

    // 初始化节点指针
    p->prev = NULL;
    p->next = NULL;
    s->prev = NULL;
    s->next = NULL;

    // 在节点p之后插入节点s
    insertAfter(p, s);

    // 打印结果
    printf("节点p的数据:%d\n", p->data);
    printf("节点p的后一个节点数据:%d\n", p->next->data);
    printf("节点s的数据:%d\n", s->data);
    printf("节点s的前一个节点数据:%d\n", s->prev->data);

    // 释放内存
    free(p);
    free(s);

    return 0;
}

这个示例中,insertAfter函数接受两个参数:ps,分别表示要插入新节点s的位置和要插入的新节点。函数首先检查p是否为空,如果为空,则不能插入新节点。然后,它更新四个指针,将s插入到p之后。最后,主函数创建两个节点,调用insertAfter函数,并打印结果。