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

См. также:  Lex & Yacc: gcc при компиляции y.tab.c выдает много ожидаемых ошибок токена
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. Alcore

    Как уже упоминалось в комментариях @DavidSchwartz. Добавить, если условие.

    void popFromTop(struct node** hd ){
    
        struct  node* curr= *hd;
        //Base condition to handle empty list
        if(*hd == NULL)
            return;
    
        struct node* prev=NULL;
        while ( curr->next !=NULL) {
            prev=curr;
            curr=curr->next;
        }
    
        free(curr);
        if(prev != NULL)
           prev->next= NULL;
        else 
           *hd = NULL;
    
    }
    

    Большое спасибо! Это работает. Мне не хватало базовых случаев, и проблема, на которую указал @DavidSchwartz. person Alcore; 30.09.2016

  2. Alcore

    Если есть только один узел, в pop() prev всегда NULL. Поэтому поставьте условие перед prev->next = NULL.

    Также есть еще одна ошибка: если есть 0 узлов, curr также имеет значение NULL в pop(), поэтому вы можете захотеть обработать и это.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: