Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 删除链表的第一个节点_C_List_Pointers_Linked List - Fatal编程技术网

C 删除链表的第一个节点

C 删除链表的第一个节点,c,list,pointers,linked-list,C,List,Pointers,Linked List,我必须使用链表和指针在c中打印一个集合列表。但是,当我删除列表的第一个元素并尝试打印列表时,它只是在彼此下面显示了许多地址。有什么问题的建议吗?谢谢 删除功能: int delete(set_element* src, int elem){ if (src==NULL) { fputs("The list is empty.\n", stderr); } set_element* currElement; set_element* prevElement=NULL; f

我必须使用链表和指针在c中打印一个集合列表。但是,当我删除列表的第一个元素并尝试打印列表时,它只是在彼此下面显示了许多地址。有什么问题的建议吗?谢谢

删除功能:

 int delete(set_element* src, int elem){
 if (src==NULL) {
    fputs("The list is empty.\n", stderr);
 }


 set_element* currElement;
 set_element* prevElement=NULL;

 for (currElement=src; currElement!=NULL; prevElement=currElement, currElement=currElement->next)     {
    if(currElement->value==elem) {
        if(prevElement==NULL){
            printf("Head is deleted\n");
            if(currElement->next!=NULL){
                *src = *currElement->next;
            } else {

                destroy(currElement);
            }
        } else {
            prevElement->next = currElement->next;
        }
        //  free(currElement);
        break;
    }
   }



return 1;
}



 void print(set_element* start)
{
    set_element *pt = start;

    while(pt != NULL)
    {
      printf("%d, ",pt->value);
     pt = pt->next;
   }
 }
警告:此答案包含推断代码

C中的典型链表看起来有点像这样:

typedef struct _list List;
typedef struct _list_node ListNode;

struct _list {
  ListNode *head;
}

struct _list_node {
  void *payload;
  ListNode *next;
}
为了从列表中正确删除第一个元素,需要执行以下顺序:

List *aList; // contains a list

if (aList->head)
  ListNode *newHead = aList->head->next;

delete_payload(aList->head->payload); // Depending on what the payload actually is
free(aList->head);
aList->head = newHead;
这里的操作顺序很重要!尝试在不释放旧值的情况下移动磁头将导致内存泄漏;而在没有首先获得新磁头的正确值的情况下释放旧磁头会产生未定义的行为

附录:有时,上述代码的_list部分将被完全省略,列表和列表节点将保持相同;但是从你描述的症状来看,我猜这里可能不是这样

然而,在这种情况下,这些步骤基本上保持不变,但没有任何更改

编辑:

现在我看到了你的代码,我可以给你一个更完整的答案

代码中的一个关键问题是它到处都是。然而,这里有一行特别糟糕:

*src = *currElement->next;
这不起作用,是导致您崩溃的原因

在您的例子中,解决方案是要么以某种容器的方式包装链表,如上面的struct _list构造;或者重新编写现有代码以接受指向集合元素的指针,这样您就可以将指针传递给集合元素,而这正是您想要返回的操作


就性能而言,这两种解决方案可能非常接近,因此不会产生任何不利影响,但使用包装列表结构有助于传达意图。它还有助于防止指向列表的其他指针由于头部删除而变得混乱,这就是问题所在。

当您删除一个指针时,通常会发生这种情况,该指针实际上是不属于您的内存块。仔细检查函数,确保没有释放已释放的指针,也没有释放未使用malloc创建的指针。

如果列表指针与指向第一个元素的指针相同,则释放第一个元素时列表指针不再有效

此问题有两种解决方案:

让所有列表方法都使用指向列表的指针,以便在必要时进行更新。这种方法的问题是,如果在另一个变量中有指针的副本,那么该指针也会失效

不要让列表指针指向第一个元素。让它指向指向第一个元素的指针

示例代码:'

typedef struct node_struct {
  node_struct *next;
  void *data;
} Node;


typedef struct {
  Node *first;
} List;

没有任何代码很难判断,但问题可能是您正在释放列表的头条目后尝试打印列表。更新任何指向列表的指针,指向标题->下一个条目,你应该是金色的。你是如何打印列表的?你可能想阅读,这会帮助你写出更好的问题。我没有完全理解你的意思。我改变了方法,但还是一样。代码:void destroyset\u element*head{set\u element*current=head;set\u element*temp;whilecurrent!=NULL{temp=current;current=current->next;freetmp;}