Вопросы

Функция Pop в стеке связанных списков приводит к ошибке сегментации — C

Я создаю стек, используя связанный список в C. Код выглядит следующим образом:

struct node{
    int xposition;
    int yposition;
    struct node* next;
};

void pushToTop(struct node** hd, int x, int y){
    struct node* curr= *hd;
    struct node* prev=NULL;

    while(curr!=NULL){
        prev=curr;
        curr= curr->next;   
    }
    struct node* ptr= (struct node*)malloc(sizeof(struct node));
    ptr->xposition=x;
    ptr->yposition=y;
    ptr->next=curr;

    if(prev==NULL){
        *hd= ptr;}
    else{
        prev->next=ptr;
    }
}

void popFromTop(struct node** hd ){

    struct  node* curr= *hd;
    struct node* prev=NULL;
    while ( curr->next !=NULL) {
        prev=curr;
        curr=curr->next;
    }

    free(curr);
    prev->next= NULL;

}

Функция Push работает в 100% случаев. Функция извлечения работает, если в стеке несколько значений, но приводит к ошибке сегментации, когда в стеке находится одно значение. Согласно моему отладчику, проблема в методе popFromTop с

prev->next=NULL; 

Может ли кто-нибудь помочь мне понять, в чем проблема?

Если prev равно NULL, вам не следует пытаться установить prev->next в NULL. Кроме того, если вы удалите единственный узел, вам нужно установить *hd на NULL.   —  person Alcore    schedule 30.09.2016

Читать:
Как gcc помещает локальные переменные в стек?

И нужен пустой чек перед вызовом popFromTop.   —  person Alcore    schedule 30.09.2016

Не имеет отношения к реальному вопросу, но почему вы используете хвост списка в качестве вершины стека, поскольку для этого требуется обход всего списка как для всплывающего, так и для push-уведомления? Это неэффективно. Используйте head списка в качестве вершины стека, чтобы и push, и pop имели доступ к нему немедленно без какого-либо обхода.   —  person Alcore    schedule 30.09.2016

Похожие записи

Как изменить форму листа Excel с заголовком в три строки, чтобы упорядочить формат данных?

admin

Установка определенной версии python для действия github

admin

Загрузка пакета приложения завершилась ошибкой: EISDIR: недопустимая операция в каталоге (Elastic Beanstalk развертывает VSTS)

admin

Препроцессор GCC не работает? Время компиляции больших файлов с комментариями или без них

admin

Установка переменных среды в зависимости от других переменных env в Windows через powershell

admin

Проблема с ярлыком Airflow BigQueryOperator: значение ярлыка содержит недопустимые символы

admin