Почему моя функция вставки связанного списка получает ошибку сегментации при вводе строк с помощью scanf? - PullRequest
0 голосов
/ 24 марта 2020

Я студент, изучающий алгоритм, и пытаюсь реализовать связанный список со словами в алфавитном порядке. Проблема в том, что когда я получаю входные данные с помощью scanf и передаю их функции, возникает ошибка сегментации. Я попытался передать непосредственно строки, и он работал нормально.

вот код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct NOH {
    char *palavra; 
    struct NOH *next; 
    struct NOH *prev; 
}NOH;

typedef struct LISTA {
    NOH *head;
}LISTA;

void *cria_lista(){
    LISTA *new_lista = (LISTA*) malloc(sizeof(LISTA));
    new_lista -> head = NULL;

    return new_lista;
}

void insere_lista(LISTA *lista, char *palavra){
    NOH *new_node = (NOH*) malloc(sizeof(NOH));
    new_node -> palavra = palavra;

    if(lista -> head == NULL){
        lista -> head = new_node;
        new_node -> next = NULL;
        new_node -> prev = NULL;
    } else {

        if(strcmp(palavra, lista -> head -> palavra) < 0){ 
            new_node -> prev = NULL;
            new_node -> next = lista -> head;
            lista -> head -> prev = new_node;
            lista -> head = new_node;
        } else {

            NOH *aux = lista -> head;
            while(strcmp(palavra, aux -> palavra) > 0 && aux -> next != NULL)
                aux = aux -> next;

            if(aux -> next == NULL && strcmp(palavra, aux -> palavra) > 0){ 
                new_node -> next = NULL;
                new_node -> prev = aux;
                aux -> next = new_node;
            } else { //se tiver que ser inserido no meio
                new_node -> next = aux;
                new_node -> prev = aux -> prev;
                aux -> prev -> next = new_node;
                aux -> prev = new_node;
            }
        }
    }
}

void printa_lista(LISTA *lista){
    NOH *aux = lista -> head;
    if(aux == NULL)
        printf("lista vazia!\n");
    else {
        while(aux -> next != NULL){
            printf("%s -> ", aux -> palavra);
            aux = aux -> next;
        }
        printf("%s\n", aux -> palavra);
    }
}

int main(){
    char word[100];

    LISTA *L = cria_lista();

    scanf("%s", word);
    insere_lista(L, word); //using "teste" as word
    printa_lista(L);

    scanf("%s", word); 
    insere_lista(L, word); //using "testee" as word
    printa_lista(L);

    return 0;
}

Я попытался с помощью gdb найти ошибку сегментации, и это был вердикт:

Program received signal SIGSEGV, Segmentation fault.
0x000055555555498a in insere_lista (lista=0x555555756260, 
    palavra=0x7fffffffde20 "testee") at lista_encadeada.c:51
51                  aux -> prev -> next = new_node;

Использование следующего кода в качестве основного похоже на работу:

int main(){
    char word[100];  
    LISTA *L = cria_lista();

    insere_lista(L, "macaco");
    printa_lista(L);

    insere_lista(L, "avestruz");
    printa_lista(L);

    insere_lista(L, "elefante");
    printa_lista(L);

    insere_lista(L, "cavalo");
    printa_lista(L);

    insere_lista(L, "zebra");
    printa_lista(L);

    insere_lista(L, "hipopotamo");
    printa_lista(L);

    return 0;
}

Кстати, я бразилец, извините за мой английский sh и за мой код на португальском , если это слишком много проблем, я могу попробовать переписать это по-английски sh.

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