【问题标题】:Deleting head or only node in Linked List in C在C中删除链接列表中的头或唯一节点
【发布时间】:2017-08-25 00:52:39
【问题描述】:

我正在编写一个从链表中删除特定节点的函数。该功能适用​​于大多数情况,但当要删除的节点是头节点或链表中的唯一节点时,该功能不起作用。当这种情况发生时,我尝试将电流设置为等于 NULL,但这会产生分段错误,我的逻辑哪里错了?

void deleteNodeAfter(Node *head, Node *delete) {
    bool remove = false;
    Node *current = head;
    Node *delNode = delete;
    if (current->songName == delNode->songName){
        current= NULL;
        remove = true;
    }
    while (!remove) {
        if (current->link->songName == delNode->songName) {
            current->link = delNode->link;
            remove = true;
            // free(delNode);
        } else {
            current = current->link;
        }
    }
}

【问题讨论】:

标签: c pointers linked-list nodes


【解决方案1】:
void deleteNodeAfter(Node **head, Node *delete) {
  bool remove = false;
  Node *current;
  while(current=*head;head=&(current->next),current=*head;current)
  {
    if (current->songName == delNode->songName){
      // perhaps the above check should be   current==delNode
      *head=current->next
      free(current)
      return;
    }
  }
}

你需要传入一个指向列表指针的指针,以便删除操作可以更新指向列表的指针。

【讨论】:

    【解决方案2】:

    如果删除第一个则需要更新原始列表指针:

    void deleteNodeAfter(Node **head, Node *delete) {
       Node *current = *head;
       if( first ) {
         *head = (*head)->next;
         free(current);
       }
    }
    

    您需要将 pointer to pointer 传递给 first 而不是 pointer 传递给 first。使用:

    Node *head;
    Node *after;
    ...
    deleteNodeAfter( &head, after );
    

    【讨论】:

    • first 是未定义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 2015-05-08
    相关资源
    最近更新 更多