2012-04-16 2 views
0

申し訳ありませんこれまで何時間も作業してきましたが、問題を把握することはできません。私はダブルリンクされたリストを持っています。新しいノードを追加しようとすると、リンクされたリストのすべての値が変更されます。リンクされたリストaddノードは単なるノードではなくすべてのノードの値を変更します

は、今これは私が持っているものです。

void createSub(sibs *root, char *name, int size) { 

    if(root->subSibs == NULL) { 
      root->subSibs = (sibs *)malloc(sizeof(sibs)); 
      root->subSibs->name = name; 
      root->subSibs->time_stamp = createTimeStamp(); 
      root->subSibs->nextSib = NULL; 
    } 

    sibs *temp = root->subSibs; 
    if(temp != NULL) { 
    while(temp->nextSib != NULL) 
      temp = temp->nextSib; 
    } 
    sibs *t = (sibs *)malloc(sizeof(sibs)); 

    t->name = name; 
    t->time_stamp = createTimeStamp(); 
    t->nextSib = NULL; 

    if(temp != NULL) 
      temp->nextSib = t; 

    printf("root->subSibs->name = %s\n", root->subSibs->name); 
    (root->numSub)++; 

}

これは、私はそれを百万回を変更した検討完璧ではないかもしれません。誰かが私がここで間違っていることを教えてもらえますか?

rootは私が作業しているルートノードで、subSibsはリンクリストへのポインタです。私がやっていることは、root->subSibsが指すそのリンクリスト内の各ノードに名前とタイムスタンプを追加することです。私は何を得る

がある:それはおそらく、本当に一部になります

root->subSibs1: name2; 
root->subSibs2: name2; 

等...:

createSub(root, name1, size); 

プリント:

root->subSibs1: name1; 

createSub(root, name2, size); 

プリント愚かな間違いだが、どんな助けでもb素晴らしい。私は何時間も努力してきましたが、名前が変わる理由を教えてくれる人が必要です。私はその後、strcpy(root->subSibsi->name, name); for i = 0-5; root->subSibs1->nameプリントのゴミとroot->subSibs2->nameプリント正しい名前と(subSibs1->nameと同じ)、その後root->subSibs3->nameプリントのゴミのように...

+0

初期ブロック後にelseブロックが欠落していますか? –

答えて

3
t->name = name; 

をすれば

はまた、あなたはポインタをコピーしています。

t->name = strdup(name); 

または::代わりにあなたはおそらくメモリ複製したい(関数を呼び出す方法など)の詳細情報がない

t->name = malloc(strlen(name) + 1); 
strcpy(t->name, name); 
+0

ありがとうございます。私はそれがこのような愚かな間違いになるだろうと分かっていました。時間と時間それは私が完全に頑張っていることを忘れていた(明らかに)t - >名前をmallocingされていませんでした。私は迅速な対応に感謝します! – eric

+0

@ericこれらのソリューションの** one **を使用してください。 'strdup'自体が' malloc'を呼び出します。そして、「フリーズ」することを忘れないでください。 – cnicutar

1

を私はあなたが単一のバッファ(おそらくchar配列)を持っていることを推測しますcreateSubsへの呼び出しごとに同じバッファにアドレスを渡すことを確認します。これにより、作成するすべてのノードが同じバッファを指すようになります。最後に入力された文字列が常に含まれます。

1

ノードでは、の名前はchar *です。つまり、任意のメモリ位置を指すことができます。まずそれはいくらかのガベージ・バリューを持っているので、プログラマーの視点からは何も指しておらず、あなたがしたことである価値を保管するために使用することはできません。

ここで、引数char * nameが指す文字列を格納するのに十分な大きさのメモリを割り当てると、そのノードの名前を指し示すことができます。一度それを行うと、引数*をノードの名前にコピーすることができます。*

関連する問題