在头结点的循环链表中删除第i个元素 数据结构的算法设计 的代码
时间: 2024-09-12 21:04:46 浏览: 33
数据结构算法习题答案带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针).docx
5星 · 资源好评率100%
在头结点的循环链表中删除第i个元素,首先需要确保链表至少包含一个元素。以下是基于C语言的一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建一个新的节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("内存分配失败。\n");
exit(1);
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 在循环链表中删除第i个元素的函数
int deleteNodeAtIth(Node *head, int i) {
if (i < 1 || !head) {
return -1; // 参数错误或链表为空
}
Node *current = head;
Node *prev = NULL;
// 遍历链表到要删除的节点
for (int count = 0; count < i && current != head; count++) {
prev = current;
current = current->next;
}
if (current == head && count != i) {
// 没有找到第i个元素
return -1;
}
// 删除节点逻辑
prev->next = current->next;
free(current);
return 0; // 成功删除
}
// 主函数,用于测试
int main() {
Node *head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
head->next->next->next = head; // 构成循环链表
printf("原始链表: ");
Node *temp = head->next;
while (temp != head) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
// 删除第2个元素
int deleteStatus = deleteNodeAtIth(head, 2);
if (deleteStatus == 0) {
printf("删除第%d个元素后的链表: ", 2);
} else {
printf("删除失败,第%d个位置没有元素。\n", 2);
}
temp = head->next;
while (temp != head) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
// 释放链表内存
while (head) {
Node* toDelete = head;
head = head->next;
free(toDelete);
}
return 0;
}
```
这段代码中,首先定义了一个链表节点的结构体Node,然后定义了创建节点的函数createNode和删除第i个元素的函数deleteNodeAtIth。在主函数中,创建了一个包含三个节点的循环链表,并尝试删除链表中的第2个元素,最后打印出删除元素后的链表。
阅读全文