Ir ao conteúdo

Posts recomendados

Postado

Implementei esse código, porém, estou com dificuldade em criar um menu de forma que o usuário utilize livremente todas as funções disponíveis no código de lista. Também tentei implementar a opção busca, com a finalidade de encontrar a localização das informações da pilha (fracassei miseravelmente).

Alguma sugestão para fazer essas implementações? 

Valeu!

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

struct lista{
       int info;
       struct lista* prox;
};

typedef struct lista Lista;

Lista* cria(void){
    return NULL;
}

int vazia(Lista* lista){
    if(lista == NULL){
        printf("\nA lista esta vazia!\n");
    }else{
        printf("\nA lista nao esta vazia!\n");
    }
}

Lista* insere(Lista* lista, int info){
    Lista* l = (Lista*) malloc(sizeof(Lista));
    l->info = info;
    l->prox = lista;
    printf("\nO valor %d foi inserido na lista com sucesso!", info);
    return l;
}

Lista* retira(Lista* lista, int info){
    Lista* ant = NULL; 
    Lista* l = lista;

    if(lista == NULL){
        printf("\nLista esta vazia. Nao foi encontrado a informacao %d.\n", info);
    }

    while(l != NULL && l->info != info){
        ant = l;
        l = l->prox;
    }

    if(l == NULL){
        return lista;
    }
    
    if(ant == NULL){
        lista = l->prox;
    }else{
        ant->prox = l->prox;
    }

    free(l);
    
    printf("\nO valor %d foi removido da lista com sucesso!\n", info);
    return lista;
}

void imprime(Lista* lista){
    Lista* l;
    printf("\n\nLista:\n");
    for (l = lista; l != NULL; l = l->prox){
        printf(" Informacao = %d\n", l->info);
    }
    printf("\n");
}

Lista* busca(Lista* lista, int info){
    Lista* l;
    int posicao = 1;
    printf("\nResultado da busca de %d na lista:",info);  
    for (l = lista; l != NULL; l = l->prox){
        if (l->info == info){
            printf("\n Informacao encontrada na posicao %d da lista.", posicao);
        }
        posicao++;
    }
    printf("\n");   
    return NULL;
}

void libera(Lista* lista){
    Lista* l = lista;

    while (l != NULL) {
        Lista* ant = l->prox;
        free(l);
        l = ant;
    }
    printf("\nMemoria liberada! Lista encerrada com sucesso!\n\n");
}

int main(){

    Lista* lista_idades;  

    lista_idades = cria();

    vazia(lista_idades);

    lista_idades = retira(lista_idades, 38);

    lista_idades = insere(lista_idades, 38);
    lista_idades = insere(lista_idades, 2);    
    lista_idades = insere(lista_idades, 45);
    lista_idades = insere(lista_idades, 11);
    lista_idades = insere(lista_idades, 45);
    lista_idades = insere(lista_idades, 2); 
    lista_idades = insere(lista_idades, 99);
    imprime(lista_idades);

    lista_idades = retira(lista_idades, 38);
    imprime(lista_idades);

    busca(lista_idades, 2);

    libera(lista_idades);
Postado
11 horas atrás, glaukito disse:

estou com dificuldade em criar um menu de forma que o usuário utilize livremente todas as funções disponíveis no código de lista.

Qual seria sua dificuldade?

Basta pedir para o usuário inserir alguma coisa pra testar alguma função.

image.png.825a14cee7b6bb3cd30f6f8a0f14918f.png

E daí use o comando switch().

Por exemplo, nessa opção 1 aí, peça ao usuário uma idade, insira na lista e a imprima.

Na opção 2, verifique se a lista está vazia, se estiver, informe o usuário, se não estiver, libere o nó, e se não for possível encontrar o dado que o nó carrega, informe o usuário.

Na opção 3, apenas finalize o programa.

 

11 horas atrás, glaukito disse:

int vazia(Lista* lista){
    if(lista == NULL){
        printf("\nA lista esta vazia!\n");
    }else{
        printf("\nA lista nao esta vazia!\n");
    }
}

vazia() retorna um inteiro, e deve ser usada para verificar se a lista está vazia.

Faça o simples:

// Retorna 1 (true) se estiver vazia
// Retorna 0 (false) caso contrario
int isEmpty(Lista* sPtr)
{
    return sPtr == NULL;
}

E chame-a em outras funções, como por exemplo:

11 horas atrás, glaukito disse:

Lista* retira(Lista* lista, int info){
    // ...
	
    // Esta verificando se a lista esta vazia
    // mesmo tendo criado uma funcao pra isso...
    if(lista == NULL){
        printf("\nLista esta vazia. Nao foi encontrado a informacao %d.\n", info);
    }
// ...

Aliás, normalmente é necessário modificar o ponteiro pro início da lista nesse tipo de função, e como lista_idades é do tipo Lista*, você precisa de um ponteiro pra um ponteiro.

Você pode fazer o seguinte:

struct lista{
       int info;
       struct lista* prox;
};

typedef struct lista Lista;
typedef Lista* ListaPtr;

E declarar:

// Ponteiro pro inicio da lista
ListaPtr startPtr = NULL;

Fica melhor visualmente, e um ponteiro pra um ponteiro pra Lista seria somente ListaPtr*, a não ser que queira criar um tipo ListaPtrPtr, mas daí já é demais :D

  • Obrigado 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!