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