带头结点的循环链表中删除第i个元素C代码
时间: 2024-09-19 10:09:13 浏览: 33
循环链表数到m删除该结点-链表-C语言
在带头结点的循环链表中删除第`i`个元素的C语言实现可能会比较复杂,因为我们需要考虑到链表是否为空、`i`的有效性和链表是否有环的情况。下面是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 插入节点到循环链表
void insert(Node** head, int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = *head; // 新节点的下一个指向前一个头节点
if (*head == NULL) { // 如果链表空,则新节点既是头也是尾
newNode->next = newNode;
} else {
Node* temp = *head;
for (int i = 0; temp != newNode && i < 2; i++, temp = temp->next) {}
temp->next = newNode;
newNode->next = *head;
}
}
// 删除循环链表中的第i个元素
void deleteElement(Node** head, int i) {
if (*head == NULL) return;
Node* current = *head;
int index = 0;
while (current->next != *head && index < i - 1) {
current = current->next;
index++;
}
if (index == i - 1) {
if (current->next == *head) { // 链表长度为偶数,头节点会被删除
Node* temp = *head;
while (temp->next != *head) {
temp = temp->next;
}
temp->next = *head->next;
} else { // 链表长度为奇数,中间节点会被删除
current->next = current->next->next;
}
}
}
// 打印链表
void printList(Node* head) {
if (head == NULL) return;
Node* temp = head;
do {
printf("%d ", temp->data);
temp = temp->next;
} while (temp != head);
printf("\n");
}
int main() {
Node* head = NULL;
insert(&head, 1); // 示例插入操作
insert(&head, 2);
insert(&head, 3);
insert(&head, 4); // 创建一个循环链表
int i = 2; // 想要删除的元素索引
printf("Before deletion: ");
printList(head);
deleteElement(&head, i);
printf("After deletion at position %d: ", i);
printList(head);
return 0;
}
```
请注意,这段代码假设从0开始计数,`i=0`表示第一个元素。此外,它只处理了简单情况,对于特殊情况(如链表长度小于`i`,`i`大于链表长度等),需要额外的错误检查和处理。
阅读全文