изменить и вернуть указатель на структуру - PullRequest
0 голосов
/ 22 октября 2018

Я работаю над структурой стека LIFO, реализованной в виде односвязного списка:

typedef struct spile {
    char ch;
    struct spile *address;
} Spile, *Pile;

, и я хочу закодировать функцию push, которая добавляет элемент (char) в начало списка.

Почему что-то подобное приводит к дампу ядра:

Pile add_head (Pile P, char c) {
    P->address = P;
    P->ch = c;
    return P ;
}

Хотя работает аналогичная функция (на этот раз удаляется элемент head)?

Pile remove_head (Pile P) {
    P = P->adress;
    return P;
} 

Я знаю, что могу справиться с этим так:

#define MALLOC(t)      ((t*)malloc(sizeof(t)))

Pile add_head (Pile P, char c) {
    Pile P1 = MALLOC(Spile);
    P1->address = P;
    P1->ch = c;

    return P1;
}

, но я бы хотел, чтобы функция модифицировала P, а не возвращала новый указатель.Более того, поскольку я нигде не освобождаю (P1), приведенная выше версия приводит к утечке памяти, если я не ошибаюсь.

edit: add_head называется так

Pile my_pile = NULL;
my_pile = add_head(my_pile, 'z');

КогдаЯ говорю, что хотел бы изменить параметр P в add_head. Я имею в виду, что функция P должна возвращаться, но с новым элементом в ней.

1 Ответ

0 голосов
/ 22 октября 2018

Мне бы хотелось, чтобы функция (add_head) изменяла P, а не возвращала новый указатель.

Если вы добавляете новый элемент в структуру, вам необходимовыделить память для этого нового элемента.

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

Old List with A,B,C
 ___       ___       ___       ______ 
| A | --> | B | --> | C | --> | NULL |
|___|     |___|     |___|     |______|
 Head

New List after adding element D
 ___       ___       ___       ___       ______ 
| D | --> | A | --> | B | --> | C | --> | NULL |
|___|     |___|     |___|     |___|     |______|
 Head

Вторая функциято что вы написали (с malloc) необходимо.

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