我如何从链接列表中删除任何项目?
How do i delete any item from a linked list?
我正在尝试编写一个函数,从链表中删除给定位置的元素,目前我使用的是仅具有头指针的链表。现在可能是用户输入的位置大于链表的大小,因此为了补救我写了这个:
int delete(struct node** head, int pos)
{
struct node* temp = *head;
while(pos!=0 && temp->next!=NULL)
{
temp=temp->next;
pos--;
}
if(pos>0)
return 0;
}
但它给出了以下错误
fish: './a.out' terminated by signal SIGSEGV (Address boundary error)
我尝试通过编写新代码来调试它
int delete(struct node** head)
{
if((*head)->next==NULL)
return 1;
}
但它给出了同样的错误
正如@paddy 评论的那样,
我没有考虑 head 本身指向 NULL 的情况。
一个简单的 if 语句解决了它
struct node* temp = *head;
if(temp==NULL){
printf("Empty LL\n");
free(temp);
return 0;
}
当 head
为 NULL
时,temp->next
的计算将给出未定义的行为或您遇到的错误。
但是,您的函数还有更多需要更正的地方。
没有发生删除。要删除一个节点,它的前身应该有它的 next
属性 更新指向被删除节点之后的节点。然后应释放已删除的节点。
删除列表的第一个节点时,应修改*head
的值。
函数应该return一个int
,所以当删除成功时(和pos == 0
在循环之后),应该有一个return
被执行,可能 returning 1 表示成功。
没问题,但我建议您为您的函数使用不同的名称。如果你转向 C++,那么 delete
将是一个保留字。
所以:
int removeNode(struct node** head, int pos) {
if (*head == NULL) {
return 0;
}
struct node* temp = *head;
if (pos == 0) { // Case where first node must be removed
*head = (*head)->next; // Modify head reference
free(temp);
return 1; // Indicate success
}
while (pos > 1 && temp->next != NULL) {
temp = temp->next;
pos--;
}
if (pos != 1 || temp->next == NULL) {
return 0; // Invalid position
}
// Remove the node
struct node* prev = temp;
temp = temp->next;
prev->next = temp->next;
free(temp);
return 1; // Indicate success
}
我正在尝试编写一个函数,从链表中删除给定位置的元素,目前我使用的是仅具有头指针的链表。现在可能是用户输入的位置大于链表的大小,因此为了补救我写了这个:
int delete(struct node** head, int pos)
{
struct node* temp = *head;
while(pos!=0 && temp->next!=NULL)
{
temp=temp->next;
pos--;
}
if(pos>0)
return 0;
}
但它给出了以下错误
fish: './a.out' terminated by signal SIGSEGV (Address boundary error)
我尝试通过编写新代码来调试它
int delete(struct node** head)
{
if((*head)->next==NULL)
return 1;
}
但它给出了同样的错误
正如@paddy 评论的那样,
我没有考虑 head 本身指向 NULL 的情况。
一个简单的 if 语句解决了它
struct node* temp = *head;
if(temp==NULL){
printf("Empty LL\n");
free(temp);
return 0;
}
当 head
为 NULL
时,temp->next
的计算将给出未定义的行为或您遇到的错误。
但是,您的函数还有更多需要更正的地方。
没有发生删除。要删除一个节点,它的前身应该有它的
next
属性 更新指向被删除节点之后的节点。然后应释放已删除的节点。删除列表的第一个节点时,应修改
*head
的值。函数应该return一个
int
,所以当删除成功时(和pos == 0
在循环之后),应该有一个return
被执行,可能 returning 1 表示成功。没问题,但我建议您为您的函数使用不同的名称。如果你转向 C++,那么
delete
将是一个保留字。
所以:
int removeNode(struct node** head, int pos) {
if (*head == NULL) {
return 0;
}
struct node* temp = *head;
if (pos == 0) { // Case where first node must be removed
*head = (*head)->next; // Modify head reference
free(temp);
return 1; // Indicate success
}
while (pos > 1 && temp->next != NULL) {
temp = temp->next;
pos--;
}
if (pos != 1 || temp->next == NULL) {
return 0; // Invalid position
}
// Remove the node
struct node* prev = temp;
temp = temp->next;
prev->next = temp->next;
free(temp);
return 1; // Indicate success
}