Я студент, изучающий алгоритм, и пытаюсь реализовать связанный список со словами в алфавитном порядке. Проблема в том, что когда я получаю входные данные с помощью 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.