Ir ao conteúdo

Posts recomendados

Postado

Implemente, utilizando lista encadeada, uma fila de inteiros. Insere no fim e remove no início da lista.

#include <stdio.h>
#include <stdlib.h>

struct no {
    int dado;
    struct no *prox;
};

void imprimir(struct no *prim) {
    struct no *atual = prim;
    system("clear");
    printf("\nLista: ");

    while (atual != NULL) {
        printf("%d -> ", atual->dado);
        atual = atual->prox;
    }
    printf("NULL");
}

struct no *insere_inicio(struct no *prim) {
    int num;

    printf("\nInsira o elemento no inicio da lista: ");
    scanf("%d", &num);

    struct no *novo = (struct no *) malloc(sizeof(struct no *));
    novo->dado = num;
    novo->prox = prim;

    return novo;
}

struct no *insere_final(struct no *prim) {
    int num;

    printf("Insira o elemento no final da lista: ");
    scanf("%d", &num);

    struct no *novo = (struct no *) malloc(sizeof(struct no *));
    novo->dado = num;
    novo->prox = NULL;

    if (prim == NULL) return novo;

    struct no *ultimo = prim;

    while (ultimo->prox != NULL) {
        ultimo = ultimo->prox;
    }

    ultimo->prox = novo;
    return prim;
}

struct no *remove_fim(struct no *prim) {
    if (prim == NULL) {
        printf("Lista Vazia!");
        return NULL;
    }
    if (prim->prox == NULL) {
        printf("Removido do final!");
        free(prim);
        return NULL;
    }

    struct no *penultimo = prim;
    struct no *ultimo = prim->prox;

    while (ultimo->prox != NULL) {
        penultimo = ultimo;
        ultimo = ultimo->prox;
    }

    penultimo->prox = NULL;
    free(ultimo);
    printf("Removido do final!");
    return prim;
}

int main() {
    int op;
    struct no *prim = NULL;

    do {
        system("clear");
        printf("\n<1> - Inserir no inicio");
        printf("\n<2> - Inserir no final");
        printf("\n<3> - Remover no inicio");
        printf("\n<4> - Remover no final");
        printf("\n<5> - Imprimir");
        printf("\n<10> - Sair do programa\n\n");
        printf("Digite sua opcao: ");
        scanf("%d", &op);

        switch (op) {
            case 1:
                prim = insere_inicio(prim);
                break;

            case 2:
                prim = insere_final(prim);
                break;

            case 3:
                prim = remove_inicio(prim);
                break;

            case 4:
                prim = remove_fim(prim);
                break;

            case 5:
                imprimir(prim);
                break;
        }
    } while (op != 10);

    return 0;
}

 

Postado
2 horas atrás, paulo luz magalhaes disse:

Insere no fim e remove no início da lista.

Exato.

 

Eu vejo filas e mais filas, implementações que diferem sutilmente. Livros novos e clássicos, artigos na internet e vídeo aulas: Todas fazem somente 'enqueue', 'dequeue':

 

 

enfileirar 

desenfileirar 

 

 

 

Talvez considere retirar as funções desnecessárias de lista para as operações de fila e com isso concentra-se no que realmente importa.

 

O quê você acha?

 

 

 

 

 

Postado

Olá!

 

Use protótipos. E assim o compilador vai saber como usar as funções.  main() deve ser a primeira função de seu programa, se possível em um arquivo separado. É melhor pra você e pra todo mundo.

 

Você declarou remove_inicio() e só escreveu remove_fim(). Não é de se estranhar que o compilador tenha reclamado...

 

Vai acabar dando certo do modo como está escrevendo mas

  • vai levar uma eternidade pra testar e terminar
  • não vai conseguir usar nada em outros programas de lista: vai ter que alterar todo o código
  • listas com ponteiros só pra um lado são um 1nf3rn0 para programar. Tudo fica mais difícil e não mais fácil
  • uma lista não é um nó. E um nó não é uma lista. Programar como se fossem a mesma coisa leva a programas ruins, complicados de testar e manter. Não faça isso
  • não use programas interativos para testar. Um menu em um programa que não está pronto é um desastre. Só atrasa. Qual o propósito de ficar parado em frente a um menu se está testando uma lista encadeada? Envelhecer?
  • não misture lógica com apresentação. Só vai perder tempo. E muito.

Exemplo do que não fazer

Isso, de seu programa:
 

struct no *insere_final(struct no *prim) {
    int num;

    printf("Insira o elemento no final da lista: ");
    scanf("%d", &num);

    struct no *novo = (struct no *) malloc(sizeof(struct no *));
    novo->dado = num;
    novo->prox = NULL;

    if (prim == NULL) return novo;

    struct no *ultimo = prim;

    while (ultimo->prox != NULL) {
        ultimo = ultimo->prox;
    }

    ultimo->prox = novo;
    return prim;
}

 

Deve ser algo assim:

 

em main() por exemplo:

 

    printf("Insira o elemento no final da lista: ");
    scanf("%d", &num);
    insere_final(num);

 

e na função o resto 
 

struct no*        insere_final(int valor)
{
    struct no *novo = (struct no *) malloc(sizeof(struct no *));
    novo->dado = valor;
    novo->prox = NULL;

    if (prim == NULL) return novo;

    struct no *ultimo = prim;

    while (ultimo->prox != NULL) {
        ultimo = ultimo->prox;
    }

    ultimo->prox = novo;
    return prim;
}

 

Como está aprendendo é importante entender que insere_final() retorna (struct no*) e é isso que o compilador vai te dizer.

 

Isso também quer dizer que nesse exemplo insere_final(-300) é o que? Sim, um ponteiro para (struct no). Nada mais.

E claro que *insere_final(12) é um no, (struct no).

 

Em resumo sugiro declarar sempre

 

struct no*        insere_final(struct no *prim);

 

E não o contrário. 

 

E entenda que 

 

	*insere_final(&um_no) é (struct no*)


é um ponteiro para um nó, e
 

	*insere_final(&Um_no)

 

é um nó.

 

  • teste SEMPRE o retorno de scanf(). É ingênuo seguir adiante se não leu, por exemplo, o valor do int que vai inserir no nó que vai inserir na lista. Vai seguir pra que? Aborte ou leia de novo.

 

Abaixo, seu programa com uma linha a mais --- a linha 4 --- já compila. mas é um longo caminho até funcionar. Sugiro seguir como recomendei...

 

 

Spoiler

#include <stdio.h>
#include <stdlib.h>

struct no*      remove_inicio(struct no*);

struct no {
    int dado;
    struct no *prox;
};

void imprimir(struct no *prim) {
    struct no *atual = prim;
    system("clear");
    printf("\nLista: ");

    while (atual != NULL) {
        printf("%d -> ", atual->dado);
        atual = atual->prox;
    }
    printf("NULL");
}

struct no *insere_inicio(struct no *prim) {
    int num;

    printf("\nInsira o elemento no inicio da lista: ");
    scanf("%d", &num);

    struct no *novo = (struct no *) malloc(sizeof(struct no *));
    novo->dado = num;
    novo->prox = prim;

    return novo;
}

struct no *insere_final(struct no *prim) {
    int num;

    printf("Insira o elemento no final da lista: ");
    scanf("%d", &num);

    struct no *novo = (struct no *) malloc(sizeof(struct no *));
    novo->dado = num;
    novo->prox = NULL;

    if (prim == NULL) return novo;

    struct no *ultimo = prim;

    while (ultimo->prox != NULL) {
        ultimo = ultimo->prox;
    }

    ultimo->prox = novo;
    return prim;
}

struct no *remove_fim(struct no *prim) {
    if (prim == NULL) {
        printf("Lista Vazia!");
        return NULL;
    }
    if (prim->prox == NULL) {
        printf("Removido do final!");
        free(prim);
        return NULL;
    }

    struct no *penultimo = prim;
    struct no *ultimo = prim->prox;

    while (ultimo->prox != NULL) {
        penultimo = ultimo;
        ultimo = ultimo->prox;
    }

    penultimo->prox = NULL;
    free(ultimo);
    printf("Removido do final!");
    return prim;
}

int main() {
    int op;
    struct no *prim = NULL;

    do {
        system("clear");
        printf("\n<1> - Inserir no inicio");
        printf("\n<2> - Inserir no final");
        printf("\n<3> - Remover no inicio");
        printf("\n<4> - Remover no final");
        printf("\n<5> - Imprimir");
        printf("\n<10> - Sair do programa\n\n");
        printf("Digite sua opcao: ");
        scanf("%d", &op);

        switch (op) {
            case 1:
                prim = insere_inicio(prim);
                break;

            case 2:
                prim = insere_final(prim);
                break;

            case 3:
                prim = remove_inicio(prim);
                break;

            case 4:
                prim = remove_fim(prim);
                break;

            case 5:
                imprimir(prim);
                break;
        }
    } while (op != 10);

    return 0;
}

 

 

  • Curtir 1

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!