Outubro 26th 2007 03:22 am

Utilizando listas encadeadas

Inserção no início da lista:

1) criamos o novo nodo a ser inserido na lista

Inserção no início da lista

2) fazemos ele apontar para o primeiro elemento da lista

Inserção no início da lista

3) setamos o head para nosso novo nodo

Inserção no início da lista

Código

PHP:
  1. /**
  2.      * insere um elemento ao início da lista
  3.      *
  4.      * @param mixed $item
  5.      */
  6.     public function insertFirst($item) {
  7.         $node = new Node($item, $this->head);
  8.  
  9.         if ($this->tail == null)
  10.             $this->tail = $node;
  11.  
  12.         $this->head = $node;
  13.         $this->count++;
  14.     }

Inserção no final da lista:

1) criamos o novo nodo a ser inserido na lista

Inserção no final da lista

2) setamos o próximo nodo do ultimo elemento da lista para apontar para nosso novo nodo

Inserção no final da lista

3) setamos o tail para nosso novo nodo

Inserção no final da lista

Código

PHP:
  1. /**
  2.      * insere um elemento ao fim da lista
  3.      *
  4.      * @param mixed $item
  5.      */
  6.     public function insertLast($item) {
  7.         $node = new Node($item);
  8.  
  9.         if ($this->tail != null)
  10.             $this->tail->setNext($node);
  11.         else
  12.             $this->head = $node;
  13.  
  14.         $this->tail = $node;
  15.         $this->count++;
  16.     }

Remoção do primeiro elemento da lista:

1) basta setar o head para o próximo elemento do atual head de nossa lista

Remoção do primeiro elemento da lista

Código

PHP:
  1. /**
  2.      * remove/remove o primeiro elemento da lista
  3.      *
  4.      * @return mixed
  5.      */
  6.     public function removeFirst() {
  7.         if ($this->isEmpty())
  8.             throw new NoSuchElementException;
  9.  
  10.         $item = $this->head->getItem();
  11.         $tmp = $this->head;
  12.         $this->head = $this->head->getNext();
  13.  
  14.         $tmp->setItem(null);
  15.         $tmp->setNext(null);
  16.  
  17.         if ($this->head == null)
  18.             $this->tail = null;
  19.  
  20.         $this->count--;
  21.  
  22.         return $item;
  23.     }

Remoção de um elemento do meio da lista:

Supondo que o acesso ao elemento da lista seja feito por índice e se queira remover o item 2

Remoção de um elemento do meio da lista

Remoção de um elemento do meio da lista

Código

PHP:
  1. /**
  2.      * remove um elemento da lista a partir do index
  3.      *
  4.      * @param int $index
  5.      * @return mixed
  6.      */
  7.     public function remove($index) {
  8.  
  9.         if ($index <0 || $index>= $this->count)
  10.             throw new OutOfRangeException('Index: ' + $index);
  11.  
  12.         $target = $this->head;
  13.         $prev = null;
  14.  
  15.         for ($i=0; $i<$index; $i++) {
  16.             $prev = $target;
  17.             $target = $target->getNext();
  18.         }
  19.  
  20.         $item = $target->getItem();
  21.  
  22.         if ($target == $this->head)
  23.             $this->head = $target->getNext();
  24.         else
  25.             $prev->setNext($target->getNext());
  26.  
  27.         if ($target == $this->tail)
  28.             $this->tail = $prev;
  29.  
  30.         $target->setItem(null);
  31.         $target->setNext(null);
  32.  
  33.         $this->count--;
  34.  
  35.         return $item;
  36.     }

Inserção de um elemento do meio da lista:

Inserção de um elemento do meio da lista

Inserção de um elemento do meio da lista

Código

PHP:
  1. /**
  2.      * insere um elemento qualquer uma posição da lista
  3.      *
  4.      * @param int $index
  5.      * @param mixed $item
  6.      */
  7.     public function insert($index, $item) {
  8.         if ($index <0 || $index>= $this->count)
  9.             throw new OutOfRangeException('Index: ' + $index);
  10.  
  11.         $target = $this->head;
  12.         $prev = null;
  13.         $tmp = new Node($item);
  14.  
  15.         for ($i=0; $i<$index; $i++) {
  16.             $prev = $target;
  17.             $target = $target->getNext();
  18.         }
  19.  
  20.         $tmp->setNext($target);
  21.  
  22.         if ($prev != null) {
  23.             $prev->setNext($tmp);
  24.         } else {
  25.             $this->head = $tmp;
  26.         }
  27.     }

Ai estão os principais métodos de nossa lista, com base nesta lógica os outros se tornão muito simples.

Para quem quiser baixar o código completo e os exemplos de uso basta fazer o download neste link Arquivos do post

Mais informações: http://pt.wikipedia.org/wiki/Lista_ligada

[]'s

Compartilhe:
  • del.icio.us
  • Google
  • Digg
  • Sphinn
  • Facebook
  • Mixx
  • LinkedIn
  • Live
  • Rec6
  • Technorati
  • TwitThis
1 Estrela2 Estrela3 Estrela4 Estrela5 Estrela (Nenhuma avaliação ainda)
Loading ... Loading ...

Páginas: 1 2 3

4 Comments »

4 Responses to “Utilizando listas encadeadas”

  1. Fill on 12 Dez 2007 at 11:28 #

    Eu já implementei isso em C na faculdade mas, sinceramente, nunca vi uma boa aplicação para isso. Voce teve de usar isso em php porque? Responde no meu e-mail por favor =)

    Grato

  2. Diego Tremper on 14 Dez 2007 at 02:26 #

    Felipe,

    de fato nunca utilizei uma lista encadeada em algum sistema em produção, mas pelo que sei, a vantagem de utilizar listas encadeadas está na inserção e remoção de elementos no meio da lista, sendo que não há a necessidade de mover os demais elementos da lista para esta ação.

    Obs.: A idéia do blog é justamente difundir e expor opiniões sobre assuntos diversos, por isso respondi aqui sua pergunta. Espero que não se ofenda.

    Abraço

  3. Dil Okulu on 31 Mar 2008 at 07:00 #

    hello everybody. my Portuguese is not good but it seems like a very nice web site. thanks

  4. milla on 26 Jun 2009 at 04:43 #

    muito boa explicação

Trackback URI | Comments RSS

Leave a Reply

« Erro pra lá de estranho no PHP | PHP Conference Brasil 2007 »