Question: What is causing this code to close itself after the first insertion?
Repl link/Link to where the bug appears: https://replit.com/@theusf40/Atividade-Lista-Encadeada#questoes/q1.c
Screenshots, links, or other helpful context: I’m doing some Linked List code challenges in C, and it seemed to work as expected when coded into a single file, but as I tried to break down my code to be more readable, it stops working after the first insertion in the list, simply stopping the program with no more output. I opened the broken down code inside another tool, like Online GDB, and it worked with no issues.
The console doesn’t even allow me to insert the first element of the list, for some reason. Here’s the code that I’m trying to make work, it’s in Portuguese, but I hope it won’t be an issue to debug it in. To help, I’ve translated the functions called inside them.
Question1.c
/** The content of this file is called inside main.c
* Didn't include main, as it only calls this function through a "questions.h"
*/
#include <stdio.h>
#include <stdlib.h>
#include "../listaEncadeada.h"
void q1() {
int resp, resp2 = 1;
printf("Lista Simplesmente Encadeada \n");
celula *topo, *buscado, *topoPar, *topoImpar;
for (int j = 0; j < 4; j++) {
printf("Digite o próximo elemento da lista: ");
scanf("%d", &resp);
topo = insertAtEnd(resp, topo);
//This part is not even called, since the program stops at the first insertion in the above code
printList(topo);
}
printf("Fim da Inserção \n");
while (resp2) {
celula *aux = topo;
while (aux != NULL) {
// Adiciona aux no topoPar se aux->conteudo for par
if (aux->conteudo % 2 == 0) topoPar = insertAtEnd(aux->conteudo, topoPar);
else topoImpar = insertAtEnd(aux->conteudo, topoImpar);
// Passa pro próximo elemento
aux = aux->prox;
}
printf("Lista original:\n");
printList(topo);
printf("\nLista de pares:\n");
printList(topoPar);
printf("\nLista de impares:\n");
printList(topoImpar);
printf("Deseja repetir a busca? 1 - Sim, 0 - Não\n");
scanf("%d", &resp2);
}
}
LinkedList.c
#include <stdio.h>
#include <stdlib.h>
#include "listaEncadeada.h"
celula *insertAtEnd(int x, celula *p) {
celula *novo, *topo;
topo = p;
novo = malloc(sizeof(celula));
novo->conteudo = x;
novo->prox = NULL;
if (p != NULL) {
for (p; p->prox != NULL; p = p->prox)
;
p->prox = novo;
} else
topo = novo;
return topo;
}
celula *search(int x, celula *lista) {
celula *aux = lista;
while (aux != NULL && aux->conteudo != x)
aux = aux->prox;
return aux;
}
celula *recursiveSearch(int x, celula *lista) {
if (lista == NULL)
return NULL;
if (lista->conteudo != x)
return buscarRecursivo(x, lista->prox);
else
return lista;
}
void remove(celula *p) {
celula *lixo;
lixo = p->prox;
p->prox = lixo->prox;
free(lixo);
}
celula *searchAndRemove(int x, celula *listaEncadeada) {
celula *p, *q;
p = listaEncadeada;
if (p->conteudo == x) {
q = listaEncadeada;
p = listaEncadeada->prox;
free(q);
return p;
} else {
q = listaEncadeada->prox;
while (q != NULL && q->conteudo != x) {
p = q;
q = q->prox;
}
if (q != NULL) {
p->prox = q->prox;
free(q);
}
return listaEncadeada;
}
}
celula *insertnBeginning(int x, celula *p) {
celula *nova;
nova = malloc(sizeof(celula));
nova->conteudo = x;
nova->prox = NULL;
if (p != NULL)
nova->prox = p;
p = nova;
return p;
}
void printList(celula *listaEncadeada) {
celula *p;
for (p = listaEncadeada; p != NULL; p = p->prox)
printf("%d\n", p->conteudo);
}
LinkedList.h
#ifndef LISTA_ENCADEADA_H
#define LISTA_ENCADEADA_H
//Boilerplate da lista encadeada
typedef struct NODO {
int conteudo;
struct NODO *prox;
} celula;
celula *insertAtEnd(int x, celula *p);
celula *search(int x, celula *lista);
celula *RecursiveSearch(int x, celula *lista);
void remove(celula *p);
celula *searchAndRemover(int x, celula *listaEncadeada);
celula *insertAtBeginning(int x, celula *p);
void printList(celula *listaEncadeada);
#endif