在C语言中,可以使用索引和列表作为参数从链表中删除一项。下面是一个示例代码:
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
struct Node {
int data;
struct Node* next;
};
// 在链表末尾插入新节点
void insert(struct Node** head, int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
} else {
struct Node* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
// 从链表中删除指定索引位置的节点
void deleteAtIndex(struct Node** head, int index) {
if (*head == NULL) {
printf("链表为空,无法删除节点。\n");
return;
}
struct Node* temp = *head;
// 如果要删除的是头节点
if (index == 0) {
*head = temp->next;
free(temp);
return;
}
// 找到要删除节点的前一个节点
for (int i = 0; temp != NULL && i < index - 1; i++) {
temp = temp->next;
}
// 如果索引超出链表长度
if (temp == NULL || temp->next == NULL) {
printf("索引超出链表长度,无法删除节点。\n");
return;
}
// 将要删除节点的下一个节点连接到前一个节点
struct Node* nextNode = temp->next->next;
free(temp->next);
temp->next = nextNode;
}
// 打印链表
void printList(struct Node* head) {
struct Node* current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
int main() {
struct Node* head = NULL;
// 插入节点
insert(&head, 1);
insert(&head, 2);
insert(&head, 3);
insert(&head, 4);
insert(&head, 5);
printf("链表:");
printList(head);
// 删除索引为2的节点
deleteAtIndex(&head, 2);
printf("删除索引为2的节点后的链表:");
printList(head);
return 0;
}
这段代码中,我们定义了一个链表节点结构Node
,包含一个整型数据data
和一个指向下一个节点的指针next
。然后,我们实现了insert
函数用于在链表末尾插入新节点,deleteAtIndex
函数用于删除指定索引位置的节点,printList
函数用于打印链表。
在deleteAtIndex
函数中,我们首先处理了链表为空的情况。然后,我们判断要删除的节点是否是头节点,如果是,则将头指针指向下一个节点,并释放原头节点的内存。如果要删除的节点不是头节点,我们使用一个循环找到要删除节点的前一个节点。最后,我们将要删除节点的下一个节点连接到前一个节点,并释放要删除节点的内存。
在main
函数中,我们创建了一个空链表,并插入了一些节点。然后,我们打印链表,删除索引为2的节点,并再次打印链表。
这是一个简单的链表删除节点的示例,可以根据实际需求进行修改和扩展。
领取专属 10元无门槛券
手把手带您无忧上云