c语言单链表删除跟插入
时间: 2024-09-12 08:00:59 浏览: 21
在C语言中,单链表是一种动态数据结构,操作主要包括插入和删除节点。下面我会简单描述这两种操作:
**插入节点:**
1. **在头部插入**(insert at beginning):
- 创建一个新的节点,存储新数据。
- 新节点的`next`指针指向当前头结点。
- 如果链表为空,则将头结点设置为新节点。
```c
void insert_at_beginning(struct Node** head, int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = *head;
*head = newNode;
}
```
2. **在尾部插入**(insert at end):
- 遍历链表找到最后一个节点。
- 将新节点的`next`指针设为NULL,然后将其`next`指向前一个节点。
```c
void insert_at_end(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;
return;
}
struct Node* lastNode = *head;
while (lastNode->next != NULL)
lastNode = lastNode->next;
lastNode->next = newNode;
}
```
**删除节点:**
1. **删除特定值的节点**:
- 定义两个指针,`current`遍历查找目标节点,`previous`记录前一个节点。
- 当找到目标节点时,更新`previous`的`next`为`target.next`。
```c
void delete_node(struct Node** head, int key) {
struct Node* previous = NULL, *current = *head;
while (current != NULL && current->data != key) {
previous = current;
current = current->next;
}
if (current == NULL) return; // 找不到节点
if (previous == NULL) *head = current->next; // 删除头节点
else previous->next = current->next;
free(current); // 释放内存
}
```
2. **删除指定位置的节点**:
- 类似地,先找到该位置的前一个节点,再更新其`next`指针跳过要删除的节点。
```c
void delete_by_position(struct Node** head, int position) {
if (position < 0 || *head == NULL) return;
struct Node* temp = *head;
for (int i = 0; i < position && temp != NULL; ++i) {
temp = temp->next;
}
if (temp == NULL) return; // 越界或链表为空
temp->next = temp->next->next;
}
```