I have an error that only appears during the execution of the program. I would like someone who has the knowledge of why this happens, can you explain.
#include<stdio.h>
#include<stdlib.h>
struct TNoDeCaractere
{
char caractere;
struct TNoDeCaractere *proximo;
};
struct TNoDeCaractere* inicio;
void insere(char valor){
struct TNoDeCaractere *p, *np;
//Se a lista está vazia, cria um nó e faz "inicio"apontar para ele.
if(inicio == NULL){
np=malloc(sizeof(struct TNoDeCaractere));
(*np).caractere= valor;
(*np).proximo =inicio;
inicio=np;
}else{//Caso contrário, ou seja, se a lista não está vazia...
p=malloc(sizeof(struct TNoDeCaractere));
p=inicio;
//varre toda a lista,
while((*p).proximo !=inicio){
p=(*p).proximo;
}printf("Teste");
//Cria novo nó
np=malloc(sizeof(struct TNoDeCaractere));
(*np).caractere=valor;
(*np).proximo=inicio;
// e liga a lista existente ao novo nó.
(*p).proximo=np;
}
}
void imprimir(){
struct TNoDeCaractere *p;
p=inicio;
while((*p).proximo !=NULL){
printf("Valor: %d \n",(*p).proximo);
p=(*p).proximo;
}
}
void remover(char valor)
{
struct TNoDeCaractere *pAnt, *p;
//Verifica se a partir do segundo nó, há nó a ser retirado.
pAnt=inicio;
p=(*inicio).proximo;
while(p!=inicio)
{
if((*p).caractere == valor)
{
(*pAnt).proximo=(*p).proximo;free(p);
p=(*pAnt).proximo;
}else{
pAnt=(*pAnt).proximo;
p=(*p).proximo;
}
}//Testa se a lista estácom o valor aser retirado no primeiro nó
if((*inicio).caractere == valor)
{
p=(*inicio).proximo;
free(inicio);
inicio=p;
}
}
int main(){
inicio=NULL;
insere("a");
insere("c");
insere("b");
imprimir();
remover('b');
imprimir();
}
I have a "printf (" Test ")" after the loop (in the function insert) which is where the program stops.
I've worked out how to make the code after a few attempts and manipulations at the pointer positions. However the reason that made me miss I do not know. I just manipulated the whole code to try to make it work. I'll now post the correct code.
#include<stdio.h>
#include<stdlib.h>
struct TNoDeCaractere
{
char caractere;
struct TNoDeCaractere *proximo;
};
struct TNoDeCaractere *inicio;
void insere(char valor){
struct TNoDeCaractere *p, *np;
//Se a lista está vazia, cria um nó e faz "inicio"apontar para ele.
if(inicio == NULL){
np=malloc(sizeof(struct TNoDeCaractere));
(*np).caractere= valor;
(*np).proximo =np;
inicio=np;
}else{//Caso contrário, ou seja, se a lista não está vazia...
p=inicio;
//varre toda a lista,
while((*p).proximo !=inicio){
p=(*p).proximo;}
//Cria novo nó e insere no final.
np=malloc(sizeof(struct TNoDeCaractere));
(*np).caractere=valor;
(*np).proximo=inicio;
// e liga a lista existente ao novo nó.
(*p).proximo=np;
}
}
void imprimir(){
struct TNoDeCaractere *p;
p=inicio;
while((*p).proximo !=inicio){
printf("Valor: %c \n",(*p).caractere);
p=(*p).proximo;
}
printf("Valor: %c \n",(*p).caractere);// Linha para imprimir ultima letra.
}
void remover(char valor)
{
struct TNoDeCaractere *pAnt, *p;
//Verifica se a partir do segundo nó, há nó a ser retirado.
pAnt=inicio;
p=(*inicio).proximo;
while(p!=inicio)
{
if((*p).caractere == valor)
{
(*pAnt).proximo=(*p).proximo;free(p);
p=(*pAnt).proximo;
}else{
pAnt=(*pAnt).proximo;
p=(*p).proximo;
}
}//Testa se a lista estácom o valor aser retirado no primeiro nó
if((*inicio).caractere == valor)
{
p=(*inicio).proximo;
free(inicio);
inicio=p;
}
}
int main(){
inicio=NULL;
insere('G');insere('a');insere('b');
insere('r');insere('i');insere('e');insere('l');
imprimir();
remover('b');
imprimir();
}