写出在不带头结点的单链表上第i位置删除和插入一个结点的C语言算法
时间: 2024-10-24 16:17:32 浏览: 16
在C语言中,如果我们有一个不带头结点的单链表,要在特定位置i插入或删除一个节点,我们需要首先处理链表的一些基本操作:
**删除第i个节点(假设已知节点指针prev和当前链表长度n)**:
```c
void delete_node_at_position(Node **head, int i) {
if (*head == NULL || i <= 0 || i > n) {
printf("Invalid position!\n");
return;
}
Node *curr = *head;
for (int j = 1; j < i && curr != NULL; j++) {
curr = curr->next;
}
if (curr == NULL) {
printf("Node at position %d not found.\n", i);
} else {
Node *temp = curr->next;
curr->next = temp->next;
free(temp); // 释放待删除节点的内存
}
}
```
在这个函数里,我们遍历到位置i的前一个节点,然后更新它的`next`指针跳过目标节点。
**插入节点到第i个位置**:
```c
void insert_node_at_position(Node **head, int i, int data) {
Node *new_node = malloc(sizeof(Node)); // 创建新节点
new_node->data = data;
if (*head == NULL) { // 链表为空,直接添加
*head = new_node;
} else if (i == 1) { // 插入头节点
new_node->next = *head;
*head = new_node;
} else {
Node *prev = *head, *curr = *head->next;
for (int j = 1; j < i && curr != NULL; j++) {
prev = curr;
curr = curr->next;
}
if (curr == NULL) {
printf("Position %d out of range!\n", i);
} else {
new_node->next = curr;
prev->next = new_node;
}
}
}
```
这里我们在找到相应位置时插入新节点,并保持链表结构的连续性。
阅读全文