How to print a list in C?

Asked

Viewed 924 times

1

   /* define a struct TAD lista */
struct lista {
    float info;         /* dado */
    struct lista *prox; /* ponteiro para o proximo elemento */
};
typedef struct lista Lista;

I have the struct above and the following int main down below:

int main(int argc, char **argv) {
    Lista *lista;

    /* cria a lista */
    lista = lista_cria();

    /* cria dados para inserir */
    float x = 1.0, y = 2.5;

    /* insere os dois pontos */
    lista = lista_insere(lista, x);
    printf("X (1.0) inserido...\n");
    lista = lista_insere(lista, y);
    printf("Y (2.5) inserido...\n");    

The function that inserts the value á struct:

Lista* lista_insere( Lista* l, float info )
{
    Lista* novo = (Lista*) malloc(sizeof(Lista));
    novo->info = info;
    novo->prox = l;
    return novo;
}

I’ve been racking my brain trying to make a printf on main but I’m not getting it. I’ve been trying to put in int main the following:

Lista* p = lista;
printf("%f", p->info);

But the error appears "Dereferencing Pointer to incomplete type"

/*
 * principal.c Programa que testa a TAD Lista.
 */
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#include "lista.h"

int main(int argc, char **argv) {
    Lista *lista;

    /* cria a lista */
    lista = lista_cria();

    /* cria dados para inserir */
    float x = 1.0, y = 2.5;

    /* insere os dois pontos */
    lista = lista_insere(lista, x);
    printf("X (1.0) inserido...\n");
    lista = lista_insere(lista, y);
    printf("Y (2.5) inserido...\n");

    /* testa se estão na lista */
    if(lista_busca(lista, x) != NULL) {
        printf("Hoooray! Ao buscar encontrei X (1.0)...\n");
    } else {
        printf("ERRO! Ao buscar nao encontrei X (1.0)...\n");
    }

    if (lista_busca(lista, y) != NULL) {
        printf("Hoooray! Ao buscar encontrei Y (2.5)...\n");
    } else {
        printf("ERRO! Ao buscar nao encontrei Y (2.5)...\n");
    }

    /* remove um elemento da lista e testa se ele esta na lista */
    float z = 5.0;
    lista = lista_insere(lista, z);
    printf("Z (5.0) inserido...\n");

    float w = 3.3;
    lista = lista_insere(lista, w);
    printf("W (3.3) inserido...\n");

    printf("Impressão comum...\n");
    lista_imprime(lista);

    lista = lista_remove(lista, y);
    if(lista_busca(lista, y) == NULL) {
        printf("Hoooray! Ao remover não encontrei Y (2.5)...\n");
    } else {
        printf("ERRO! Ao remover nao encontrei Y (2.5)...\n");
    }

    lista = lista_remove(lista, z);
    if(lista_busca(lista, z) == NULL) {
        printf("Hoooray! Ao remover não encontrei Z (5.0)...\n");
    } else {
        printf("ERRO! Ao remover nao encontrei Z (5.0)...\n");
    }

    printf("Impressão recursiva...\n");
    lista_imprime_rec(lista);

    lista_destroi(lista);
    printf("Tudo Ok\n");

    return 0;
}

principal above

/*
 * lista.h
 * Definição da TAD Lista.
 */
#ifndef _LISTA_H_
#define _LISTA_H_

#include <stdbool.h>

/* define o tipo Lista, derivado da 'struct _lista' */
typedef struct lista Lista;

/* cria uma lista vazia, ou seja, retorna NULL */
Lista* lista_cria(void);

/* insere no começo da lista, retorna a lista atualizada */
Lista* lista_insere( Lista* l, float num );

/* retorna se a lista esta vazia (true), ou false caso contrario */
bool lista_vazia( Lista* l );

/* busca um elemento na lista e retorna-o caso ele seja encontrado */
Lista* lista_busca( Lista* l, float info );

/* percorre os elementos, imprimindo-os */
void lista_imprime( Lista* l );

/* percorre os elementos recursivamente, imprimindo-os */
void lista_imprime_rec( Lista* l );

/* remove da lista o elemento que contem 'info'. Se lista ficar vazia, retorna NULL.
   Se nao encontrou, retorna a lista 'l'.
   Senao, o elemento removido deve ser liberrado com free.
*/
Lista* lista_remove( Lista* l, float info );

/* libera a memória de cada nó da lista. */
void lista_destroi( Lista* l );

#endif

lista.h above

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

#include "lista.h"

/* define a struct TAD lista */
struct lista {
    float info;         /* dado */
    struct lista *prox; /* ponteiro para o proximo elemento */
};

/* cria lista vazia */
Lista* lista_cria(void)
{
    return NULL;
}

/* retorna se a Fista esta vazia (true), ou false caso contrario */
bool lista_vazia( Lista* l )
{
    return (l == NULL);
}

/* insere no comeco da lista, retorna a lista atualizada */
Lista* lista_insere( Lista* l, float info )
{
    Lista* novo = (Lista*) malloc(sizeof(Lista));
    novo->info = info;
    novo->prox = l;
    return novo;
}

/* busca um elemento na lista e retorna-o caso ele seja encontrado */
Lista* lista_busca( Lista* l, float info )
{
    Lista* p = l;
    while(p != NULL) {
        if(p->info == info)
            return p;
        p = p->prox;
    }


    return NULL;
}

/* percorre os elementos, imprimindo-os */
void lista_imprime( Lista* l )
{
        Lista* p = l;
        while(p != NULL){
            printf("%f\n", p->info);
            p = p->prox;
        }

    printf("Elementos Impressos\n");
}

/* percorre os elementos recursivamente, imprimindo-os */
void lista_imprime_rec( Lista* l )
{
    //TODO Implementar
    printf("Erro!! Não implementado!\n");
}

/* remove da lista o elemento que contem 'info'. Se lista ficar vazia, retorna NULL.
   Se nao encontrou, retorna a lista 'l'.
   Senao, o elemento removido deve ser liberrado com free.
*/
Lista* lista_remove( Lista* l, float info )
{
    //TODO Implementar
    return l;
}

/* libera a memória de cada nó da lista. */
void lista_destroi( Lista* l )
{
    Lista* elem = l;
    while( lista_vazia(elem) == false ){
        Lista* t = elem->prox;
        free(elem);
        elem = t;
    }
}

lista.c above

what I want is just take the function list_print and put it in the main, but I’m not getting

  • Confirm that you have the structure declaration at the top even before it is used in any function

  • Yes, I even created a function to print and it worked, the problem is only when I do at MAIN

  • This should have to do with the order. Put the code exactly as you have it from top to bottom. See here in Ideone your example working

1 answer

1

Try to put the structure definition in the list file. h

/*
 * lista.h
 * Definição da TAD Lista.
 */
#ifndef _LISTA_H_
#define _LISTA_H_

#include <stdbool.h>

/* define a struct TAD lista */
struct lista {
    float info;         /* dado */
    struct lista *prox; /* ponteiro para o proximo elemento */
};

/* define o tipo Lista, derivado da 'struct _lista' */
typedef struct lista Lista;

/* cria uma lista vazia, ou seja, retorna NULL */
Lista* lista_cria(void);

/* insere no começo da lista, retorna a lista atualizada */
Lista* lista_insere( Lista* l, float num );

/* retorna se a lista esta vazia (true), ou false caso contrario */
bool lista_vazia( Lista* l );

/* busca um elemento na lista e retorna-o caso ele seja encontrado */
Lista* lista_busca( Lista* l, float info );

/* percorre os elementos, imprimindo-os */
void lista_imprime( Lista* l );

/* percorre os elementos recursivamente, imprimindo-os */
void lista_imprime_rec( Lista* l );

/* remove da lista o elemento que contem 'info'. Se lista ficar vazia, retorna NULL.
   Se nao encontrou, retorna a lista 'l'.
   Senao, o elemento removido deve ser liberrado com free.
*/
Lista* lista_remove( Lista* l, float info );

/* libera a memória de cada nó da lista. */
void lista_destroi( Lista* l );

#endif

Browser other questions tagged

You are not signed in. Login or sign up in order to post.