0

さて、私はこれに何時間も取り組んできましたが、私の問題を理解することはできません。二重リンクリストがあり、それに新しいノードを追加しようとすると、リンクリストのすべての値が変更されます。

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

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です。

私が出てくるのは:

createSub(root, name1, size);

プリント:

root->subSibs1: name1;

createSub(root, name2, size);

プリント:

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

等...

それはおそらく本当にばかげた間違いでしょうが、どんな助けも素晴らしいでしょう。私は何時間も努力してきましたが、名前が変わる理由を誰かに教えてもらう必要があります。

また、strcpy(root->subSibsi->name, name); for i = 0-5; root->subSibs1->nameガベージをroot->subSibs2->name印刷してから正しい名前をroot->subSibs3->name印刷してからガベージ(と同じsubSibs1->name)を印刷すると...

4

3 に答える 3

4
t->name = name;

ポインタをコピーしています。代わりに、おそらくメモリを複製したいと思うでしょう:

t->name = strdup(name);

または:

t->name = malloc(strlen(name) + 1);
strcpy(t->name, name);
于 2012-04-16T08:31:43.030 に答える
1

詳細情報 (関数の呼び出し方法など) がなければ、単一のバッファー (おそらく char 配列) があり、 への呼び出しごとに同じバッファーにアドレスを渡すと思いますcreateSubs。これにより、作成するすべてのノードが同じバッファーを指すようになり、最後に入力された文字列が常に含まれます。

于 2012-04-16T08:33:05.403 に答える
1

あなたのノードでは、名前は char *です。つまり、任意のメモリ位置を指すことができます。まず、ガベージ値があるため、プログラマーの観点からは何も指さず、値を保存するために使用することはできません-これはあなたがしたことです。

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

于 2012-04-16T08:39:23.577 に答える