Проблемы со связанным списком в C - PullRequest
1 голос
/ 16 июня 2009

Я делаю связанный список (структур) в 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);
}

Очевидно, это не сработает. Как я могу это сделать? Это вообще возможно. Спасибо

РЕДАКТИРОВАТЬ: Wow спасибо всем за помощь. Это было быстрее и полезнее, чем я мог себе представить!

Ответы [ 3 ]

5 голосов
/ 16 июня 2009

Вы должны выделить свои «один», «два», «три» с помощью 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;
}
3 голосов
/ 16 июня 2009

В этом коде:

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;
}
2 голосов
/ 16 июня 2009

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);
}

Я предполагаю, что вы создаете двойной связанный список, поэтому я могу свободно устанавливать левый / правый указатели соответственно. Если я ошибаюсь в своем предположении, пожалуйста, настройте его в соответствии с вашими потребностями.

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...