2011-02-07 16 views
0

誰かが交換機能が動作しない理由を教えてください。 main(replace、1,2、list)と呼ばれます。ノードを検索し、ノードの値が1の場合は、値2の新しいノードを作成して置換し、最初のノードに割り当てられたメモリを解放する必要があります。私はあなたのreplace()機能に問題のカップルがあります=(c - リンクされたリスト機能を置き換えます。

typedef struct iNode 
{ 
    int myInt; 
    struct iNode* next; 
} IntNode, *IntNodePtr; 

IntNodePtr insert(int i, IntNodePtr p) 
{ 
    IntNodePtr newp = malloc(sizeof(struct iNode)); 
    newp->myInt = i; 
    newp->next = p; 
    return newp; 
} 

IntNodePtr delete(int i, IntNodePtr p) 
{ 
    /* End of list check */ 
    if(p == NULL) 
     return NULL; 

    /* Check if current node is the one to delete */ 
    if(p->myInt == i) 
    { 
     IntNodePtr temp; 
     temp = p->next; 

     free(p); 
     return temp; 
    } 

    p->next = delete(i, p->next); 
    return p; 
} 

IntNodePtr replace(int i, int j, IntNodePtr p) 
{ 
    if(p == NULL) 
     return NULL; 

    if(p->myInt == i) 
     insert(j, p->next); 

    free(p); 

    p->next = replace(i, j, p->next); 
    return p; 
} 
+0

リストの最初のリンクを常に 'replace'関数に渡す必要があることに注意してください。そうしないと、リストが破られてしまいます。これはあなたがこれまでに持っていた2つか3つの答えにも当てはまります。私はおそらくそれが仮定されていることを知っているが... – JimR

答えて

0

それを把握することはできません。(それはあなたの最後の質問に私には罰金に見えた)。

  1. あなたはときinsert()を呼び出しますあなたはiを持つノードを見つけることができますが、基本的に、あなたが挿入されている新しいノードがそうあなたがそれにpを設定する必要があり、新たなpです(何insert()戻ります)。新しいノードで何もしない。

  2. pを解放し、すぐにpnextフィールドに値を設定しようとしました。場所pが無効であることを指していたので、そのことを行うべきではありません。一時変数を使用して古いpを保存し、後でその変数を解放する必要があります。前の状態の一部になるように実際に交換した場合にのみ行う必要があります。

私はそれをカバーする必要があると思います。基本的には、変更点は

/* if the current node contains the int I'm looking for... */ 
if(p->myInt == i) 
{ /* ... the current node needs to be replaced */ 
    /* save the current node to delete later (2) */ 
    IntNodePtr oldNode = p; 

    /* insert a new node making it the new current node (1) */ 
    p = insert(j, oldNode->next); 

    /* free the old node (2) */ 
    free(oldNode); 
} 
/* and so on */ 
+0

コードを編集してjeffを投稿できますか?イムは徹底的に混乱し、このことに不満を持ち、まだそれを理解していません。私は私の古い機能も好きでしたが、機能は不変でなければならず、私の古い機能は変更可能でした。 – mikecavs

+0

@mike:あなたはほとんどそれを持っていました。基本的に 'delete()'関数と同様の構造を持っています。うまくいけば、それはあなたのためにはるかに明確になりました。 –

+0

Jeffさん、本当にありがとうございました。私のコードが間違っている理由を理解するには、正しいコードを見なければならないことがあります。 – mikecavs

0

となります。free(p)の動作は未定義です。したがって、次の文

p->next = replace(i, j, p->next); 

を使用すると、ポインタ値にp->nextを割り当てるしようとしているので、無効になりますが、p->nextメモリ位置自体が定義されていません。

しかし、なぜあなたはこのリプレース機能を再帰的にしましたか?簡単なwhileループで十分です。

IntNodePtr replace(int i, int j, IntNodePtr p) { 
    if(p == NULL) 
     return NULL; 
    IntNodePtr prevPtr = NULL; 
    while(p){ 
     if(p->myInt == i){ 
      IntNodePtr temp = insert(j, p->next); 
      if(prevPtr) 
       prevPtr->next = temp; 
      free(p); 
      break; 
     } 
     prevPtr = p; 
     p = p->next; 
    } 
} 

そして、あなたが新たに作成されたノードに前のノードを接続していないので、あなたは間違って、同様にあなたの挿入機能を使用しています。

関連する問題