用自定义函数实现删除单链表中第 i个位置上的元素,删除成功返回true,同时返回要删除的元素值,否则返回 false。要求: (1)操作结果(成功与否)通过函数值返回。 (2)被删除的元素值通过指针形参或引用形参返回 用C
时间: 2023-03-24 22:01:25 浏览: 94
下面是一种用C语言实现的方法,可以实现删除单链表中第i个位置的元素,并返回是否删除成功以及被删除元素的值:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 删除单链表中第i个位置的元素
bool removeNthElement(ListNode **head, int i, int *val) {
if (i < 1 || *head == NULL) {
return false; // 删除失败,i小于1或链表为空
}
ListNode *p = *head, *prev = NULL;
int count = 1;
while (p != NULL && count < i) {
prev = p;
p = p->next;
count++;
}
if (p == NULL) {
return false; // 删除失败,i大于链表长度
}
if (prev == NULL) {
*head = p->next;
} else {
prev->next = p->next;
}
if (val != NULL) {
*val = p->val;
}
free(p);
return true; // 删除成功
}
```
在该实现中,首先需要定义一个单链表节点结构体`ListNode`,包含一个整型变量`val`和一个指向下一个节点的指针`next`。然后定义一个名为`removeNthElement`的函数,该函数接收一个指向指针的指针`head`、一个整数`i`和一个指向整型变量的指针`val`作为参数。函数的返回值为一个布尔值,表示是否删除成功。
在函数中,首先判断i是否小于1或链表是否为空,如果是,则直接返回删除失败。否则,定义两个指针变量`p`和`prev`,分别指向当前节点和当前节点的前一个节点。使用循环遍历单链表,找到第i个节点。如果遍历完整个链表后仍未找到第i个节点,则返回删除失败。否则,根据当前节点是否为头节点,更新头节点或前一个节点的指针,然后释放当前节点的内存。最后,如果val不为NULL,则将被删除节点的值赋值给val。最终返回删除成功。