C: Невозможно связать голову и хвост в двойном связанном списке с внешней функцией [решение проблемы] - PullRequest
0 голосов
/ 09 февраля 2011

Я сделал упрощение моего двойного связанного списка.Мой двойной связанный список - это структура, в которой узлами являются голова и хвост.

Существует функция для создания списка и его возврата.В той же функции я делаю связь между хвостом и головными узлами.Проблема в том, что когда я возвращаю список (так что выхожу за пределы функции), все ссылки исчезают или они просто указывают на узлы списка, который был временно создан в функции.Правильно ли мое предположение?Если так, как я собираюсь обойти эту проблему?

Вот код:

#include <stdio.h>

typedef struct node{        /*a node of a list*/
    int number;
    struct node *next;
    struct node *prev;
} node;

typedef struct list{    /*the list structure that holds only the head and tail*/
    node head;
    node tail;
} list;

list createList(){
    list newList;
    newList.head.prev=NULL;
    newList.head.next=&newList.tail; /*first node points to the second*/
    newList.tail.prev=&newList.head; /*second node points to the first*/
    newList.tail.next=NULL;
    puts("--CREATE LIST FUNC--");
    printf("Head element address: %p\n", &newList.head);
    printf("Tail element address: %p\n", &newList.tail);
    printf("Head element points here: %p\n\n\n", newList.head.next);
    return newList;
}

int main(){
    list numbers=createList();
    puts("--MAIN FUNC--");
    printf("Head element address: %p\n", &numbers.head);
    printf("Tail element address: %p\n", &numbers.tail);
    printf("Head element points here: %p\n", numbers.head.next);
    return 0;
}

Ответы [ 3 ]

1 голос
/ 09 февраля 2011

Ваше предположение верно;newList выходит из области видимости после завершения функции.Функция возвращает копию объекта list, но члены-указатели по-прежнему будут указывать на оригинальный объект.

Вам нужно либо выделить list в куче, и вернутьпо указателю (не забывая освободить память в какой-то момент), или взять указатель на list в качестве аргумента и изменить list, которым владеет вызывающий объект.

0 голосов
/ 09 февраля 2011

вы не можете создать список как list newlist внутри вашей функции, потому что он находится в стеке.Вам необходимо вернуть указатель на список.Переменные в стеке не обязательно будут там, как только ваша функция вернется.

list* createList(){
    list* newList = (list*)malloc(sizeof(list));
    newList->head.prev=NULL;
    newList->head.next=newList->tail; /*first node points to the second*/
    newList->tail.prev=newList->head; /*second node points to the first*/
    newList->tail.next=NULL;
    puts("--CREATE LIST FUNC--");
    printf("Head element address: %p\n", newList->head);
    printf("Tail element address: %p\n", newList->tail);
    printf("Head element points here: %p\n\n\n", newList->head.next);
    return newList;
}
0 голосов
/ 09 февраля 2011

Вам необходимо использовать динамическое выделение памяти (malloc() и free()), поскольку вы не можете вернуть вновь созданный элемент списка по значению.

...