我正在编写一个程序,并且我必须从其中一个函数中删除LinkedList中的值
struct node *delete_val(int value, struct node *head) {
struct node *h1 = head;
if (head == NULL) { return NULL;}
if (head->next == NULL) { free(head); return NULL;}
while (h1 != NULL) {
if (h1->next != NULL && h1->next->data == value){
h1->next = h1->next->next;
} else {
h1 = h1->next;
}
free(h1);
return head;
}
}
如果通过:
(4,[3,4,5,6,4,4,7]);
该函数应该返回:
[3,5,6,4,4,7]
但我的功能是收到错误:
错误:您的函数返回的列表无效。 节点0的下一个字段无效(0xf5400650)。
我基本上都在检查下一个节点是否包含其数据中的匹配值' (head-> next->数据),如果是,我将当前链接列表的指针(head-> next)重新切换到其后的指针(head-> next-) >接下来)但我甚至无法让它发挥作用。
答案 0 :(得分:0)
有两个问题。
如果你纠正这两个,我认为应该没问题。
struct node *delete_val(int value, struct node *head) {
struct node *h1 = head;
struct node *tmp = NULL;
if (head == NULL) { return NULL;}
if (head->next == NULL) { free(head); return NULL;}
while (h1 != NULL) {
if (h1->next != NULL && h1->next->data == value){
tmp = h1->next;
h1->next = h1->next->next;
break;
} else {
h1 = h1->next;
}
}
free(tmp);
return head;
}
答案 1 :(得分:0)
node *delete_val(int value, node *head)
2.此处你也不需要struct
node *h1 = head;
if(head == NULL ) {
return NULL;
}
else {
node *tmp = NULL;
while( h1 != NULL) {
if ( h1->data == value){
tmp = h1;
h1 = h1->next;
delete tmp;
}
h1 = h1->next ;
/* else can be avoided */
}
}
答案 2 :(得分:0)
确保链接列表不是空的,而不是
if (head->next == NULL) { free(head); return NULL;}
DO
if(head->next == NULL)
{
if(head->data == value)
{
free(head);
return NULL;
}
return head;
}
只有当data
是要删除的值时才释放第一个节点。
到目前为止,我们确信链表中至少有2个节点。
struct node *temp=NULL, *ptr=head;
while(ptr->next!=NULL)
{
if(ptr->next->data==value)
{
printf("\nElement to be deleted found.");
temp=ptr->next;
ptr->next=ptr->next->next;
free(temp);
break;
}
ptr=ptr->next;
}
printf("\nElement to be deleted not found in the list.");
return head;
我们展望下一个节点的data
是否为value
。如果是,则将要删除的节点之前的节点的next
等于要删除的节点的next
,然后使用{{1}取消分配要删除的节点的内存。 }。