1

C で (構造体の) リンクされたリストを作成していますが、関数を呼び出して、それ自体でリストに 4 ~ 5 個のスタクトを追加できるようにしたいと考えています。問題は、C では関数で作成されたすべての変数がスタック/ヒープに残されているため、これをどのように達成するのか見当がつかないことです。

コード例を次に示します。

struct listItem
{
   int value;
   listItem *left;
   listItem *right;
}

void addItems(listItem *l)
{
   listItem one, two, three;
   l->left = &one;
   one.left = &two;
   two.left = &three;
}

int main (char *a [])
{
   listItem l;
   addItems(l);
}

明らかにこれは機能しません。どうすればこれを達成できますか? それは可能ですか?ありがとう

編集:うわー、助けてくれてありがとう。想像以上に早くて助かりました!

4

3 に答える 3

5

「1」、「2」、「3」をスタック上に作成する代わりに、malloc() で割り当てる必要があります。それらを使い終わったら、リストをもう一度調べて、メモリ上で free () を呼び出して、プログラムがリークしないようにする必要があります。

代わりにこの addItem を試してください...

void addItem(listItem *l, int value)
{
   listItem* item = malloc (sizeof (listItem));
   item->value = value;
   item->next = 0;
   item->prev = l; // Probably not what you want, but you were only singly linking in the example

   l->next = item;
}
于 2009-06-15T20:50:43.667 に答える
3

このコードでは:

void addItems(listItem *l)
{
   listItem one, two, three;
   l->left = &one;
   one.left = &two;
   two.left = &three;
}

すべての変数は、ヒープではなくスタックに残されます。おそらく、それらをヒープに割り当てて、スタック フレームが残されても無効にならないポインターを参照できるようにします。

void addItems(listItem *l)
{
   listItem *one=calloc(1, sizeof(*one)), 
     two=calloc(1, sizeof(*two)),
     three=calloc(1, sizeof(*three));
   l->left = one;
   one.left = two;
   two.left = three;
}
于 2009-06-15T20:53:55.033 に答える
2

addItems() はメモリを割り当てる必要があります:

void addItems(listItem *l)
{
   listItem* one = (listItem*)malloc(sizeof(listItem));
   listItem* two = (listItem*)malloc(sizeof(listItem));
   listItem* three = (listItem*)malloc(sizeof(listItem));
   l->left = 0;
   l->right = one;
   one->left = l;
   one->right = two;
   two->left = one;
   two->right = three;
   three->left = two;
   three->right = 0;
}

int main ()
{
   listItem l;
   addItems(&l);
}

二重リンクリストを作成しようとしていると仮定しているので、それに応じて左右のポインターを自由に設定できます。私の仮定が間違っている場合は、ニーズに合うように調整してください。

乾杯

于 2009-06-15T20:54:43.097 に答える