-3

これは私の削除ノード機能です。何が問題なのかを知るのを手伝ってくれる人はいますか? わからない部分が多くて困っているようです。

  1. 頭へのポインターはどのように使用されると思われますか? struct lnode** ヘッド、これがヘッド ポインターへのポインターであることはわかっています。ただし、正しく使用しているかどうかはわかりません。

  2. コードの 2 番目の部分では、関数が呼び出すノードを削除した後、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);
        }
    }
    
4

1 に答える 1

1

この修正プログラムで試してみてください。元のプログラムでは、次の問題がありました。

削除するノードが head と一致する場合、ノードを 2 回解放していることになります。すでに解放されているメモリを解放しようとすると、例外が発生します。

代わりにif必要な条件の比較if((*head)->next == node)if((*head)->next = node)

メモリを解放する順序は重要です。したがってnode->word、 を解放する前に解放する必要がありnodeます。

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);
}
}
于 2013-02-23T02:08:59.233 に答える