用c语言写出详细代码实现在长度大于1的循环单链表中,即无头结点也无头指针,s为指向链表中某个结点的指针,要求删除结点s的前趋结点
时间: 2024-10-11 18:09:28 浏览: 32
链表-使用C语言实现带头结点的单链表.zip
在C语言中,如果我们想要在一个长度大于1的循环单链表中删除指定结点`s`的前趋结点,我们需要先找到前趋结点,然后再删除它。由于链表是循环的,所以我们需要注意处理特殊情况,避免陷入无限循环。以下是详细的步骤和代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 插入节点到循环链表的末尾
void insert_to_end(Node** head, int data) {
Node* newNode = create_node(data);
if (*head == NULL) {
newNode->next = newNode; // 初始只有一个节点时,形成环形链表
} else {
Node* current = *head;
while (current->next != *head) {
current = current->next;
}
newNode->next = *head; // 将新节点接到末尾
current->next = newNode;
}
}
// 创建新节点并分配内存
Node* create_node(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 删除前驱节点(假设s是非空指针)
void delete_predecessor(Node** s) {
if (*s == NULL || (*s)->next == NULL) {
printf("Invalid operation: Cannot delete the first node in a circular linked list.\n");
return;
}
Node* predecessor = (*s)->next;
Node* current = *s;
while (predecessor != *s) { // 循环直到找到目标节点
predecessor = predecessor->next;
}
current->next = predecessor->next; // 删除前趋节点
free(predecessor); // 释放前趋节点的内存
}
// 打印链表
void print_list(Node* head) {
if (head == NULL) {
printf("Empty list.\n");
return;
}
Node* current = head;
do {
printf("%d ", current->data);
current = current->next;
} while (current != head);
printf("\n");
}
int main() {
// 初始化链表
Node* head = create_node(1);
insert_to_end(&head, 2);
insert_to_end(&head, 3); // 假设链表为 (1 -> 2 -> 3 -> 1)
// 打印原始链表
printf("Original list:\n");
print_list(head);
// 指定删除节点
Node* s = head->next; // 假设我们要删除第二个节点,s指向第三个节点
// 删除前驱节点
delete_predecessor(&s);
// 再次打印新的链表
printf("List after deleting predecessor of %d:\n", s->data);
print_list(head);
return 0;
}
```
这段代码首先定义了链表节点结构,并实现了插入和删除操作。`delete_predecessor`函数用于查找并删除给定结点`s`的前趋结点。请注意,这里的链表操作仅适用于循环链表。
阅读全文