Функция 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

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

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

Источник: ledsshop.ru

Стиль жизни - Здоровье!