Помещение элемента в стек с использованием связанных списков - PullRequest
0 голосов
/ 19 сентября 2018

почему, помещая элемент в стек, вы возвращаете указатель головы?Это необходимо или просто хорошая практика?Большое спасибо, я думаю, что что-то упустил.Например:

   struct node* push(struct node* head,int data)
   {
    struct node* tmp = (struct node*)malloc(sizeof(struct node));
    if(tmp == NULL)
    {
    exit(0);
    }
    tmp->data = data;
    tmp->next = head;
    head = tmp;
    return head;
}

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Причина, по которой вы возвращаете head, заключается в том, что вы не теряете заголовок списка.

Подумайте о том, как структурирован связанный список.Когда у вас есть четыре элемента в списке, это выглядит так:

A -> B -> C -> D

'head' - это первый элемент, A.

Теперь вы собираетесь нажатьновый предмет, назовите его X, в стек.Вы добавляете его в начало списка:

X -> A -> B -> C -> D

Теперь head - это новый первый элемент, X.

Теперь давайте посмотрим, как вы это используете.У вас есть связанный указатель списка, назовите его listHead, который вы инициализируете как NULL.Вы хотите добавить в него элементы:

struct node* listHead = NULL;
...
listHead = push(listHead, 22);

Если вы не вернули head из функции push, то вы никогда не назначите новое значение для listHead.Это всегда будет NULL;

0 голосов
/ 19 сентября 2018

Если вы хотите построить стек поверх односвязного списка, вы должны всегда вставлять новый узел в head.Потому что, если вы вставите узел из tail, во время открытия / удаления узла вам нужно будет сделать tail->prev новым tail.Но в односвязном списке нет указателя prev.

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