2013-02-23 82 views
-3

这是我的删除节点函数,任何人都可以帮我看看它有什么问题吗?我似乎遇到了很多麻烦,因为我不了解它的某些部分。deleteNode函数错误

  1. 指向头的指针是否会假设被使用? struct lnode **头,我知道这是一个指向头指针的指针。但是我不确定我是否正确使用它。

  2. 代码的第二部分,我不确定在删除函数调用的那个后,我是否正确连接了这两个节点。

    void deleteNode (struct lnode** head, struct lnode* node) { 
         if((*head) == node){ 
          struct lnode* temp = (*head) -> next; 
          free(node); 
          free(node->word); 
          *head = temp; 
         } 
         else{ 
         struct lnode *nextNode = node->next; 
         struct lnode *prevNode; 
         while((*head) != NULL){ 
          if((*head)->next = node){ 
           prevNode = *head; 
           break; 
          } 
          else 
           *head = (*head) -> next; 
         } 
         prevNode->next = nextNode; 
         free(node); 
         free(node->word); 
        } 
    } 
    
+0

写入'free(node); free(node-> word);'因为第二个调用正在访问一个现在释放的内存块。您必须将这些呼叫排序为“free(节点 - >单词);自由(节点);'。 – 2014-05-05 03:33:00

回答

1

请与该修改的程序试试。在原始计划中,存在以下问题。

如果要删除的节点与head匹配,那么您将节点释放两次。当您尝试释放已经释放的内存时,这会产生异常。

if条件的比较是if((*head)->next == node)代替if((*head)->next = node)

的释放内存是重要的顺序所需的。因此在释放node之前应该释放node->word

void deleteNode (struct lnode** head, struct lnode* node) { 
    struct lnode *prevNode = *head; 
    if((*head) == node){ 
     struct lnode* temp = (*head) -> next; 
     *head = temp; 
    } 
    else{ 
    struct lnode *nextNode = node->next; 
    while((*head) != NULL){ 
     if((*head)->next == node){ 
      prevNode = *head; 
      break; 
     } 
     else 
      *head = (*head) -> next; 
    } 
    prevNode->next = nextNode; 
    free(node->word); 
    free(node); 
} 
} 
+0

感谢您的帮助! – 2013-02-23 02:13:30

+0

我的荣幸:)你是否按照预期的方式工作? – Ganesh 2013-02-23 02:15:23

+1

此代码修改传入的头部。除非头部被删除,否则不应该修改。在循环初始化'struct lnode * prevNode = * head;'并在循环迭代中使用'prevNode = prevNode-> next;' – user1952500 2013-02-23 02:21:03