Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá a todos,
Estou estudando listas dinâmicas e implementei um programa que faz algumas operações em uma lista, como adicionar célula ao, inicio, no final ou em qualquer posição, remover células, zerar lista e etc. Tudo correu bem exceto com uma função adiciona uma célula ao final da lista. Tentei encontrar o erro mas parece tudo nos conformes no entanto quando insiro o elemento para adicionar a célula no final da lista ele da a mensagem "Segmentation Fault" e não entendo o porquê.
O código da função é esse:
void adcionaFim(celula *ini, int n)
{
if(vazia(ini)!=0)
{
celula *novo = aloca();
novo->prox = NULL;
celula *ptr;
ptr=ini->prox;
while(ptr!=NULL)
{
ptr = ptr->prox;
}
ptr->prox = novo;
novo->conteudo = n;
}
else
{
celula *novo = aloca();
ini->prox = novo;
novo->prox = NULL;
novo->conteudo = n;
}
}
O código de todo o programa segue abaixo:
#include <stdio.h>
#include <stdlib.h>
typedef struct cel
{
int conteudo;
struct cel *prox;
}celula;
int tam=0;
celula *aloca(void);
int vazia(celula *ini);
void adcionaInicio(celula *ini,int n);
void adcionaFim(celula *ini, int n);
celula *aloca(void);
int retiraInicio(celula *ini);
int retiraFim(celula *ini);
int insere(celula *ini,int pos,int n);
int preencheElem(void);
int remover(celula *ini,int pos);
void libera(celula *ini);
void exibir(celula *ini);
int menu(void);
int obterPos(void);
int option(celula *ini);
int main()
{
celula *inicial = (celula*)malloc(sizeof(celula));
char continuar[4];
int opcao;
do
{ system("clear");
opcao = option(inicial);
if(opcao != 0)
{
printf("\n\nPressione qualquer tecla + <ENTER> para continuar: ");
scanf("%s",continuar);
}
}while(opcao != 0);
} celula *ptr;
ptr = ini->prox;
if(ptr==NULL)
{
return 0;
}
return 1;
} celula *novo = aloca(),*oldHead;
oldHead = ini->prox;
novo->prox = oldHead;
ini->prox = novo;
novo->conteudo = n;
}
else
{
celula *novo = aloca();
ini->prox = novo;
novo->prox = NULL;
novo->conteudo = n;
}
}
void adcionaFim(celula *ini, int n)
{
if(vazia(ini)!=0)
{
celula *novo = aloca();
novo->prox = NULL;
celula *ptr;
ptr=ini->prox;
while(ptr!=NULL)
{
ptr = ptr->prox;
}
ptr->prox = novo;
novo->conteudo = n;
}
else
{
celula *novo = aloca();
ini->prox = novo;
novo->prox = NULL;
novo->conteudo = n;
}
}
celula *aloca(void)
{
celula *ptr =(celula*)malloc(sizeof(celula));
tam+=1;
return ptr;
}
int retiraInicio(celula *ini)
{
if(vazia(ini)==0)
{
return 0;
}
else
{
celula *temp;
temp = ini->prox;
ini->prox = temp->prox;
free(temp);
tam-=1;
return 1;
}
}
int retiraFim(celula *ini)
{
if(vazia(ini)==0)
{
return 0;
}
else
{
celula *penultima=ini,*ultima=ini->prox;
while( ultima!= NULL)
{
penultima=penultima->prox;
ultima = ultima->prox;
}
penultima->prox = NULL;
free(ultima);
tam-=1;
return 1;
}
}
int insere(celula *ini,int pos,int n)
{
int i;
if(pos<1 || pos > tam)
{
printf("\n\nPosicao fora do intervalo necessario(entre 1 e %d)",tam);
return 0;
}
else
{
if(vazia(ini)==0)
{
celula *novo = aloca();
ini->prox = novo;
novo->prox = NULL;
return 1;
}
else
{
celula *novo = aloca();
if(pos == 1)
{
adcionaInicio(ini,n);
return 1;
}
else if(pos == tam)
{
adcionaFim(ini,n);
return 1;
}
else
{
celula *atual,*anterior,*novo;
novo = aloca();
anterior = ini;
atual = ini->prox;
for(i=1;i<pos;i++)
{
anterior = atual;
atual = atual->prox;
}
anterior->prox=novo;
novo->prox=atual;
novo->conteudo=n;
return 1;
}
}
}
}
int preencheElem(void)
{
int num;
printf("\n\nDigite um valor inteiro para preencher a celula da lista: ");
scanf("%d",&num);
return num;
}
int remover(celula *ini,int pos)
{
int i;
if(pos < 1 || pos > tam)
{
printf("\n\nA posicao escolhida esta fora do intervalo permitido!");
return 0;
}
if(vazia(ini)==0)
{
return 0;
}
else if(pos == 1)
{
retiraInicio(ini);
tam-=1;
return 1;
}
else if(pos == tam)
{
retiraFim(ini);
tam-=1;
return 1;
}
else
{
celula *anterior,*atual;
anterior = ini;
atual = ini->prox;
for(i=1;i<pos;i++)
{
anterior = atual;
atual = atual->prox;
}
anterior->prox = atual->prox;
tam-=1;
return 1;
}
}
void libera(celula *ini)
{
if(vazia(ini)==0)
{
return;
}
celula *atual, *proxCel;
atual = ini->prox;
while(atual != NULL)
{
proxCel = atual->prox;
free(atual);
atual = proxCel;
}
ini->prox = NULL;
tam = 0;
}
void exibir(celula *ini)
{
celula *ptr;
int pos=1;
for(ptr=ini->prox;ptr!=NULL;ptr=ptr->prox)
{
printf("Elemento: %d POS: %d ",ptr->conteudo,pos);
pos++;
}
}
int menu(void)
{
int opt;
printf("\t\tLista Dinamica completa\n\n");
printf("[1]Zerar lista\n");
printf("[2]Exibir Lista\n");
printf("[3]Adicionar celula no inicio\n");
printf("[4]Adicionar celula no final\n");
printf("[5]Escolher onde inserir\n");
printf("[6]Retirar do inicio\n");
printf("[7]Retirar do fim\n");
printf("[8]Escolher de onde tirar\n");
printf("[0]Sair do programa\n");
printf("Selecione uma das opções acima: ");
scanf("%d",&opt) ;
return opt;
} int pos;
printf("\n\nInsira a posicao:");
scanf("%d",&pos);
return pos;
}
int option(celula *ini)
{
int opt = menu();
switch(opt)
{
case 1:
libera(ini);
break;
case 2:
exibir(ini);
break;
case 3:
adcionaInicio(ini,preencheElem());
break;
case 4:
adcionaFim(ini,preencheElem());
break;
case 5:
insere(ini,obterPos(),preencheElem());
break;
case 6:
retiraInicio(ini);
break;
case 7:
retiraFim(ini);
break;
case 8:
remover(ini,obterPos());
break;
case 0:
libera(ini);
break;
default:
printf("\n\nOpcao invalida!");
}
return opt;
}
Se puderem ajudar desde já agradeço.
Carregando comentários...