在带头节点的单链表中,将指针P所指向的元素删除,并返回true。若参数P指向非法位置,则返回false。用C语言
时间: 2024-09-18 14:15:31 浏览: 52
在C语言中,删除带头节点的单链表中的某个元素通常涉及到对头结点的操作,因为单链表没有随机访问的功能,我们需要找到要删除元素的前一个节点。以下是一个简单的示例,假设链表节点定义为:
```c
typedef struct ListNode {
int data;
struct ListNode* next;
} ListNode;
```
首先,我们需要一个辅助函数`findPrevNode`来找到给定节点的前一个节点:
```c
ListNode* findPrevNode(ListNode* head, ListNode* p) {
if (head == NULL || p == head) return NULL; // 非法位置
ListNode* prev = head->next;
while (prev != p) {
prev = prev->next;
if (prev == NULL) return NULL; // 找不到前一个节点
}
return prev;
}
```
然后,我们可以编写删除节点的主函数,如果找到了前一个节点则进行删除,否则返回false:
```c
bool deleteNode(ListNode** head, ListNode* p) {
if (*head == NULL || p == NULL) return false;
ListNode* prev = findPrevNode(*head, p);
if (prev == NULL) return false;
// 将前一个节点的next指针指向p的下一个节点
prev->next = p->next;
// 释放被删除节点的内存(如果链表节点包含自定义数据结构时)
free(p);
// 如果原头结点被删除,更新头指针
if (*head == p) *head = prev;
return true;
}
```
使用这个函数时,首先要检查传入的头节点和待删除节点是否合法,然后调用`deleteNode`并根据其返回值处理结果。