Я создаю стек, используя связанный список в 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
Как уже упоминалось в комментариях @DavidSchwartz. Добавить, если условие.
Большое спасибо! Это работает. Мне не хватало базовых случаев, и проблема, на которую указал @DavidSchwartz. — person Alcore; 30.09.2016
Если есть только один узел, в pop()
prev
всегда NULL. Поэтому поставьте условие передprev->next = NULL
.Также есть еще одна ошибка: если есть 0 узлов,
curr
также имеет значение NULL в pop(), поэтому вы можете захотеть обработать и это.