domingo, 7 de abril de 2013

Listas encadeadas


Lembra que eu falei que podia colocar um struct dentro do mesmo struct? Pois é, assim que funcionam as listas encadeadas. De certa forma elas são como um vetor, tem vários objetos do mesmo tipo, mas no caso das listas pode ter quantos quiser (não o tamanho do vetor) e é bem mais manipulável.
A lógica das listas encadeadas é uma struct conter um ponteiro para o mesmo tipo. Dessa forma, um objeto vai se ligando do outro, porque ele aponta quem é o próximo da lista. Assim:

struct Nodo {
int dado;
struct Nodo *proximo;
} *raiz; //declara um ponteiro da struct Nodo chamado raiz

raiz = (Nodo *) malloc (sizeof(Nodo)); //aloca o tamanho da raiz
raiz->dado = 7; //preenche o dado
raiz->proximo = NULL; //fala que não tem próximo (ou seja, é o fim da lista)

Nodo *pnodo; //declara outro ponteiro, dessa vez chamado pnodo
pnodo = (Nodo *) malloc(sizeof(Nodo)); //aloca pnodo
pnodo->dado = 11; //preenche o dado
pnodo->proximo = NULL; //declara que é esse o fim da lista
raiz->proximo = pnodo; //fala que raiz agora deixa de ser o fim e aponta pra pnodo

Dessa forma, vai tendo uma continuidade, que um vai apontando pro outro. Esse tipo de lista é bem mais prático que um vetor, porque não tem um tamanho fixo e não precisa ser um logo seguido do outro (em termos de alocação de memória). Agora vamos aos procedimentos básicos:
  • Como percorrer uma lista encadeada utilizando um ponteiro
Nodo *pnodo;
pnodo = raiz;
while (pnodo != NULL) {
  printf(%d, pnodo->dado);
  pnodo = pnodo->proximo;
}
  • Como imprimir uma lista encadeada usando um ponteiro
void print_list (struct Nodo *pi) {
  printf("Lista = ");
  while (pi) {
    printf (" %d ", pi->dado);
    pi = pi->proximo;
  }
}

Nenhum comentário:

Postar um comentário