Lista Encadeada Generica (void *) em C

voidUm ponteiro genérico em C é representado pelo tipo void*. A função do tipo “ponteiro genérico” pode representar qualquer endereço de memória, independente da informação de fato armazenada nesse espaço.
Segue abaixo um exemplo de código.

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

typedef struct no{ void *conteudo; struct no *prox;} *no;

typedef struct lista{ no cabeca;} *lista;

typedef struct adj{ int dest; long int peso;} *adj;

typedef struct vertice{ char *nome;} *vertice;

//Cria um no da lista de adjacencia
no cria_adj(int dest, long int peso){
    adj v;
    no generico;
    
/*    Aloca espaço para o no da lista de adjacencia*/
    v = (adj) malloc(sizeof(struct adj));
    v->dest = dest;
    v->peso = peso;
    
/*    Aloca espaço para o no generico*/
    generico = (no) malloc(sizeof(struct no));
    generico->conteudo = v;
    generico->prox = NULL;
    
    return generico;    
}

no cria_vertice(char *nome){
    vertice v;
    no generico;
    
    v = (vertice) malloc(sizeof(struct vertice));
    v->nome = (char *) malloc(sizeof(char));
    strcpy(v->nome,nome);
    
    generico = (no) malloc(sizeof(struct no));
    generico->conteudo = v;
    generico->prox = NULL;
    
    return generico;    
}

int main (int argc, char *argv[]) {
    lista l = malloc(sizeof(struct lista));
    no teste = cria_adj(10,100);    
    l->cabeca = teste;

    no teste2 = cria_adj(20,200);
    teste2->prox = l->cabeca;
    l->cabeca = teste2;

    void imprime (lista l){
       no p;   /* variável auxiliar para percorrer a lista */
       for (p = l->cabeca; p != NULL; p = p->prox){
               adj a = p->conteudo;
               printf("conteudo = %d, %ld\n", a->dest,a->peso);
       }
    }
    
    imprime(l);    
    return 0;
}

*Os structs estão comprimidos em uma linha apenas par economizar espaço no post.

Referências: http://www.ic.unicamp.br/~ra069320/PED/MC102/1s2008/Apostilas/Cap10.pdf

Comentar

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s