Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ricardo Oliveira de Lima

Não acho erro em função que adiciona célula(nó) ao final de uma lista

Recommended Posts

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);



}
int vazia(celula *ini)
{
    celula *ptr;

    ptr = ini->prox;

    if(ptr==NULL)
    {
        return 0;

    }

    return 1;
}
void adcionaInicio(celula *ini,int n)
{
    if(vazia(ini)!= 0)
    {
        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 obterPos(void)
{
    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.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@@Ricardo Oliveira de Lima

 

-> Segmentation Fault é quando o programa tenta acessar um endereço de memória que não tem acesso.

Não olhei o código todo, mas na parte a função adcionaFim(...) acho que o erro é que você colocou while(ptr!=NULL) e o certo

seria while(ptr->prox !=NULL).

 

Código:

//...
if(vazia(ini)!=0)
    {

        celula *novo = aloca();
        novo->prox = NULL;
        celula *ptr;

        ptr=ini->prox;

        while(ptr->prox !=NULL) // ptr != NULL
        {
            ptr = ptr->prox;

        }

        novo->conteudo = n; // ptr->prox = novo;
        ptr->prox = novo; // novo->conteudo
        

    }
//...

obs: Não tenho como testar o código, poste o resultado !

 

 

brHUE

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.