用c语言写出一段正确的简单易懂的详细代码实现在长度大于1的循环单链表中,即无头结点也无头指针,s为指向链表中某个结点的指针,要求删除结点s的前趋结点
时间: 2024-10-11 08:09:44 浏览: 25
在 C 语言中,删除链表中的某一个节点需要考虑到它的前驱节点,因为我们需要找到并更新前驱节点的 `next` 指针。下面是一个详细的代码示例,假设我们有一个循环链表,并且给定的 `s` 指向的就是要删除节点的直接前驱节点(因为循环链表找不到实际的头节点):
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int data;
struct Node *next;
} Node;
// 删除链表中的指定节点(s的前驱)
void deletePrevNode(Node **tail, Node *s) {
// 确保链表不为空且s非NULL
if (*tail == NULL || s == NULL)
return;
// 如果s就是链表的第一个节点(循环链表)
if (s->next == *tail)
(*tail) = s->next; // 更新尾节点指向s的下一个节点
// 如果s有前驱节点
else {
s->next = s->next->next; // 将s的next指向前一个节点的后一个节点,达到删除目的
}
}
// 示例链表操作函数
void printList(Node *node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
int main() {
// 创建一个循环链表示例
Node *head = malloc(sizeof(Node));
head->data = 1;
Node *node2 = malloc(sizeof(Node));
node2->data = 2;
Node *node3 = malloc(sizeof(Node));
node3->data = 3;
head->next = node2;
node2->next = node3;
node3->next = head; // 创建循环链表
// 设置s为删除节点的前驱
Node *s = node2;
// 删除s的前趋节点
deletePrevNode(&head, s);
// 输出删除后的链表
printList(head);
return 0;
}
```
在这个代码中,`deletePrevNode` 函数接收一个指向链表尾部的指针 `tail` 和要删除节点的前驱 `s`。如果 `s` 也是尾节点,则直接更新尾部指针。否则,将 `s` 的 `next` 指针指向 `s->next->next`。
阅读全文