2009-06-15 1 views
1

Я создаю связанный список (структур) на C, но я хочу, чтобы иметь возможность вызвать функцию и добавить ее 4-5 столбцов в список. Проблема в том, что в C все переменные, созданные в функциях, остаются в стеке/куче, я не знаю, как я должен это делать.Проблемы со связанным списком в 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); 
} 

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

EDIT: Вау благодарит всех за помощь. Это было быстрее и полезнее, чем я мог себе представить!

ответ

5

Вы должны выделить свои «одно», «два», «три» с помощью 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

В этом коде:

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

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

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

Cheers

 Смежные вопросы

  • Нет связанных вопросов^_^