C语言单链表如何删除结点
时间: 2024-12-11 19:13:32 浏览: 27
在C语言中,单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。要删除单链表中的节点,可以按照以下步骤进行:
1. **找到要删除的节点**:遍历链表,找到要删除的节点。
2. **调整指针**:将前一个节点的指针指向要删除节点的下一个节点。
3. **释放内存**:释放要删除节点的内存。
以下是一个示例代码,演示如何在单链表中删除一个节点:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义单链表节点结构
struct Node {
int data;
struct Node* next;
};
// 函数声明
struct Node* createNode(int data);
void insertAtEnd(struct Node** head_ref, int data);
void deleteNode(struct Node** head_ref, int key);
void printList(struct Node* node);
int main() {
struct Node* head = NULL;
// 插入节点
insertAtEnd(&head, 1);
insertAtEnd(&head, 2);
insertAtEnd(&head, 3);
insertAtEnd(&head, 4);
printf("原始链表: ");
printList(head);
// 删除节点
int key = 3;
deleteNode(&head, key);
printf("删除节点 %d 后的链表: ", key);
printList(head);
return 0;
}
// 创建新节点
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 在链表末尾插入节点
void insertAtEnd(struct Node** head_ref, int data) {
struct Node* newNode = createNode(data);
if (*head_ref == NULL) {
*head_ref = newNode;
return;
}
struct Node* temp = *head_ref;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
// 删除节点
void deleteNode(struct Node** head_ref, int key) {
struct Node* temp = *head_ref;
struct Node* prev = NULL;
// 如果头节点就是要删除的节点
if (temp != NULL && temp->data == key) {
*head_ref = temp->next; // 改变头节点
free(temp); // 释放内存
return;
}
// 查找要删除的节点,并保存前一个节点
while (temp != NULL && temp->data != key) {
prev = temp;
temp = temp->next;
}
// 如果未找到节点
if (temp == NULL) return;
// 从链表中移除节点
prev->next = temp->next;
free(temp); // 释放内存
}
// 打印链表
void printList(struct Node* node) {
while (node != NULL) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
```
在这个示例中,我们定义了一个单链表节点结构,并实现了创建节点、插入节点、删除节点和打印链表的功能。`deleteNode`函数用于删除链表中指定值的节点。
阅读全文