Ir ao conteúdo

Posts recomendados

Postado

Tenho esse código em C que permite adicionar no inicio e no fim da lista e remover do inicio da lista, precisava criar um método para remover do fim da lista, porém não estou conseguindo, alguém pode me ajudar?

    
   

typedef struct abstracao
    {
        int valor;
        struct abstracao *prox;
    }lista;
    
    lista *inicio;
    lista *aux;
    lista *fim;
    
    int op, x, contador;
    
    void InserirInicio(int a)
    {
        printf(" ---- -INSERIR- ----");
        struct abstracao *novo = malloc(sizeof(struct abstracao));
    
        novo->valor = a;
    
        if (inicio ==NULL)
        {
            inicio = novo;
            fim = novo;
            fim->prox = NULL;
        }
        else
        {
            novo->prox = inicio;
            inicio = novo;
        }
        contador++;
    }
    
    void Apresentar()
    {
        if(inicio == NULL)
            printf("Lista esta VAZIA.\n");
        else
        {
            aux = inicio;
            printf("\n");
    
            while(aux!=NULL)
            {
                printf(" %d - ", aux->valor);
                aux = aux->prox;
            }printf("\n");
            printf("Quantidade de elemento da lista: %d\n", contador);
        }
    }
    
    void RemoverInicio()
    {
        aux = inicio;
        inicio = aux->prox;
        free(aux);
        aux = inicio;
    }
    
    void InserirFinal(int a)
    {
        printf(" ---- - INSERIR- ----\n");
            struct abstracao *novo = malloc(sizeof(struct abstracao));
    
            novo->valor = a;
    
            if(inicio==NULL)
            {
                inicio = novo;
                fim = novo;
                fim->prox = NULL;
            }
            else
            {
                fim->prox = novo;
                fim=novo;
                fim->prox = NULL;
            }
    }
    
    void main()
    {
        inicio = NULL;
        aux = NULL;
    
        do
        {
            printf(" --- Digite uma opção para lista --- \n");
            printf("1 - Inserir no INICIO\n");
            printf("2 - Apresentar\n");
            printf("3 - Remover\n");
            printf("4 - Inserir FINAL\n");
            printf("5 - Remover FINAL\n");
            scanf("%d", &op);
    
            switch(op)
            {
                case 1:
                {
                    printf("Digite um valor para inserir na lista: \n");
                    scanf("%d", &x);
                    InserirInicio(x);
                }break;
    
                case 2:
                {
                    Apresentar();
                }break;
    
                case 3:
                {
                    RemoverInicio();
                }break;
    
                case 4:
                {
                    printf("Digite um valor para inserir na lista: \n");
                    scanf("%d", &x);
                    InserirFinal(x);
                }break;
    
                case 5:
                {
                    RemoverFinal();
                }
            }
    
        }while (op<6);
    }

 

Postado
void main()
    {
        inicio = NULL;
        aux = NULL;
    
        do

 

main() retorna um int e tem dois parâmetros. Declare n mínimo
 

    int main(void);


ou o simples

    int main (int argc, char** argv);

 

Em geral é má ideia escrever uma lista ou qualquer estrutura ou mesmo qualquer programa como fez. Seu programa só tem uma lista, é global, não dá pra alterar e fica tudo muito frágil. Não use nunca variáveis globais. Em geral é proibido mesmo em empresas e escolas.

 

Estruturas como essa

 

void RemoverInicio()
    {
        aux = inicio;
        inicio = aux->prox;
        free(aux);
        aux = inicio;
    }

 

são muito problemáticas. Uma função void que nem tem argumentos é um buraco negro. Não use isso.

 

De seu programa

 

typedef struct abstracao
    {
        int valor;
        struct abstracao *prox;
    }lista;
    
    lista *inicio;
    lista *aux;
    lista *fim;

 

Do modo como escreveu só tem uma lista, não dá pra usar outra e mesmo assim já tem 3 ponteiros... Só vai ter mais trabalho e menos resultado

 

Mais ainda, entenda que

  • uma lista com ponteiros só para um lado é muito mais difícil de programar do que uma que tenha ponteiros para os dois lados
  • sua estrutura descreve um nó e não uma lista. uma lista não é um nó, um nó não é uma lista. Assim está limitando mais ainda seu programa e aumentando o trabalho.

Use argumentos. Retorne valores ou algum status.

 

Excluir do final seria bem simples se tivesse ponteiros para os dois lados e uma estrutura lista de verdade.

 

No entanto do modo como fez basta percorrer a lista até o fim, mas SALVANDO o penúltimo node, já que não tem o ponteiro para trás. Se foi você que escreveu isso e pode mudar sugiro que mude já antes de continuar.

 

Se não pode apenas faça como eu expliquei acima

  • Curtir 2
Postado

Entendi, obrigado pela resposta, vou tentar fazer como sugeriu, o código foi passado dessa forma pelo meu professor na faculdade, mas pelo que falou está cheio de problemas kkkkkk, vou procurar mais fontes sobre C já que é a primeira vez que estou estudando essa linguagem.

Postado
26 minutos atrás, kullas1 disse:

Entendi, obrigado pela resposta, vou tentar fazer como sugeriu, o código foi passado dessa forma pelo meu professor na faculdade, mas pelo que falou está cheio de problemas kkkkkk, vou procurar mais fontes sobre C já que é a primeira vez que estou estudando essa linguagem.

 

Sim, esse código não ganharia nenhuma medalha, mas é o que tem.

 

Isso:

 


typedef struct abstracao
    {
        int valor;
        struct abstracao *prox;
    }lista;
    
    lista *inicio;
    lista *aux;
    lista *fim;

void InserirInicio(int);
void InserirFinal(int);
void Apresentar();
void RemoverInicio();
void RemoverFinal();
  

 

é um desastre. Compare com algo simples:

 


    typedef struct 
    {
        int valor;

    }   Info;


    typedef struct node_
    {
        Info*           info;
        struct node_*   ant;
        struct node_*   prox;
    
    }   Node;


    typedef struct 
    {
        Node*       inicio;
        Node*       fim;
        unsigned    limite;
        unsigned    size;

    }   Lista;
        

int         inserir_inicio( Info*, Lista* );
int         inserir_final( Info*, Lista* );
int         remover_inicio( Lista* );
int         remover_final(  Lista* );

Lista*      criar_lista(int limite);
Lista*      remover_lista();
    

 

E entenda a diferença:

  • a Lista é de Node. Não interessa o que tem dentro. Essas funções vão funcionar para uma lista de int ou para uma lista de espaçonaves.
  • cada Node tem um dado dentro. um ponteiro para um dado no caso do exemplo, mas em geral é mesmo um void* para ficar genérico
  • para inserir no inicio ou no fim são umas poucas linhas, e a rotina recebe um ponteiro para Info, então nunca mais precisa mexer para outras listas.
  • pode declarar muitas listas de coisas distintas no mesmo programa. 
  • cada lista tem dentro dela o tamanho e um limite de registros, definido na criação

 

De volta ao programa:

 

apenas salve o endereço do anterior ao percorrer a lista. quando chegar o fim o penúltimo se existir será o novo último.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!