Skip to content

Instantly share code, notes, and snippets.

@asrail
Created November 4, 2010 02:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save asrail/662028 to your computer and use it in GitHub Desktop.
Save asrail/662028 to your computer and use it in GitHub Desktop.
C list iterator
#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
typedef int T;
typedef struct lista tlista;
typedef struct iterator titerator;
tlista *novo_lista(void);
struct iterator {
tlista *elem;
tlista *referencia;
bool (*tem_prox)(titerator *it);
bool (*eh_vazio)(titerator *it);
tlista *(*inicio)(titerator *it);
titerator *(*prox)(titerator *it);
T (*chave)(titerator *it);
};
struct lista {
T mchave;
tlista *proximo;
tlista *(*prox)(tlista *l);
tlista *(*insere)(tlista *l, T elemento);
T (*chave)(tlista *l);
};
bool it_tem_prox(titerator *it) {
if (it->elem->prox(it->elem))
return true;
return false;
}
bool it_eh_vazio(titerator *it) {
if(it->inicio(it))
return true;
return false;
}
tlista *it_inicio(titerator *it) {
return it->referencia->proximo;
}
titerator *it_prox(titerator *it) {
it->elem = it->elem->prox(it->elem);
return it;
}
T it_chave(titerator *it) {
return it->elem->chave(it->elem);
}
tlista *l_prox(tlista *l) {
return l->proximo;
}
tlista *l_insere(tlista *l, T elemento) {
tlista *novo = novo_lista();
novo->mchave = elemento;
novo->proximo = l->proximo;
l->proximo = novo;
return l;
}
T l_chave(tlista *l) {
return l->mchave;
}
tlista *novo_lista(void) {
tlista *l = malloc(sizeof(tlista));
l->proximo = NULL;
l->prox = &l_prox;
l->chave = &l_chave;
l->insere = &l_insere;
return l;
}
titerator *novo_iterator(tlista *l) {
titerator *it = malloc(sizeof(titerator));
it->referencia = novo_lista();
it->referencia->proximo = l->prox(l);
it->elem = it->referencia;
it->tem_prox = &it_tem_prox;
it->eh_vazio = &it_eh_vazio;
it->inicio = &it_inicio;
it->prox = &it_prox;
it->chave = &it_chave;
return it;
}
int main() {
T i;
titerator *it;
tlista *lista = novo_lista();
for(i = false; i < 15; i++)
lista->insere(lista, i);
it = novo_iterator(lista);
while(it->tem_prox(it))
printf("%d\n", it->prox(it)->chave(it));
/* TODO: remove memory leak of the example */
return EXIT_SUCCESS;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment