Lista Ligada - Wikipédia, A Enciclopédia Livre
Lista Ligada - Wikipédia, A Enciclopédia Livre
Lista Ligada - Wikipédia, A Enciclopédia Livre
Vantagens
Desvantagens
A manipulação torna-se mais "perigosa"
uma vez que, se o encadeamento
(ligação) entre elementos da lista for
mal feito, toda a lista pode ser perdida;
Para aceder ao elemento na posição n
da lista, deve-se percorrer todos os
elementos (n - 1) anteriores.
Níveis de complexidade
Inserção
Cabeça: O(1).
Cauda: O(n) (ou O(1) quando se
tem uma referência pro fim da
lista).
Meio: O(n).
Eliminação
Cabeça: O(1).
Cauda: O(n) (ou O(1) quando se
tem uma referência pro fim da
lista).
Meio: O(n).
Exemplo em C
Estrutura
int main(void){
No primeiro;
No segundo;
primeiro.numero = 1;
segundo.numero = 2;
primeiro.prox =
&segundo;
printf("%d\n",
primeiro.numero);
printf("%d\n",
primeiro.prox->numero);
return (1);
}
Cria Lista
No * cria_lista(){ //
Função do tipo apontador
para lista, i.e., o tipo de
função tem de ser igual ao
tipo que retorna
No * novo,*aux;
novo->prox = NULL;
/*Como esta deve ser a
primeira função a ser
executada, esta célula
vazia aponta para NULL*/
int main(void){
No * raiz;
/*raiz = (No *) malloc(
sizeof(No) ); */
raiz = cria_lista();
/* Depois começa o seu
uso: Inserção, Remoção,
etc...*/
return EXIT_SUCCESS;
}
No * inserirNoInicio(No *
raiz, int numero){
No * novo, *aux;
aux = raiz;
novo = (No *)
malloc(sizeof(No));
if(novo == NULL)
exit(0);
novo->numero = numero;
novo->prox = aux->prox;
aux->prox = novo;
return(aux);
}
No fim
void inserirNoFim(No
**raiz, int numero){
No *novo;
novo = (No *)
malloc(sizeof(No));
if(novo == NULL)
exit(0);
novo->numero = numero;
novo->prox = NULL;
if(*raiz == NULL){
*raiz = novo;
}else{
No *aux;
aux = *raiz;
while(aux->prox !=
NULL){
aux = aux-
>prox;
}
aux->prox = novo;
*raiz = aux;
}
}
Remoção
No início
void removerNoInicio(No
*raiz){
No *aux;
if(raiz == NULL)
printf("\nA lista
ja esta vazia");
else{
aux = raiz->prox;
raiz->prox = aux-
>prox;
free(aux);
}
}
No fim
void removerNoFim(struct No
**raiz){
if(*raiz == NULL)
printf("\nA lista
ja esta vazia");
else{
struct No
*auxFrente, *auxTras=NULL;
auxFrente = *raiz;
while(auxFrente-
>prox != NULL){
auxTras =
auxFrente;
auxFrente =
auxFrente->prox;
}
if(auxTras != NULL)
auxTras->prox =
NULL;
free(auxFrente);
}
}
struct dic{
char *original;
char *complementar;
struct dic *prox;
};
(*last).complementar =
complementar;
// Definição da
cabeça da fila
ini = last;
} else {
// o elemento será
o último
(*last).prox =
(struct
dic*)malloc(sizeof(struct
dic));
last =
(*last).prox;
(*last).original =
original;
(*last).complementar =
complementar;
}
}
//Percorrer e Imprimir a
lista ligada
void dic_print(){
int sair = 0;
struct dic* act = ini;
do {
if (act == last)
sair = 1;
printf("----------
---------------------------
---------\n");
printf("original:
%s\n",(*act).original);
printf("complementar:
%s\n",(*act).complementar);
printf("prox:
%d\n", (*act).prox);
act = (*act).prox;
} while(sair == 0);
printf("--------------
---------------------------
-----");
}
Exemplo em C++
#include <iostream>
using namespace std;
class Node {
public:
int value; // Pode
ser implementado qualquer
tipo de dados aqui.
Node *next;
Node () {
next = NULL; //
Construtor padrão
}
Node (int _value) {
// Construtor para o caso
de haver já um valor a ser
atribuído
value = _value;
next = NULL;
}
};
class List {
public:
Node *head; // A
"cabeça" é um ponteiro para
o primeiro elemento da
lista.
List () { //
Construtor padrão; único
head = NULL;
}
void imprime(){ //
Método para imprimir, na
saída padrão, todos os
elementos na tela;
Node* temp =
head;
while (temp) {
cout <<
temp->value << endl;
temp =
temp->next;
}
return;
}
pointer->next = pointer-
>next->next;
pointer =
pointer->next;
}
return true;
}
};
Exemplo em Java
No (Object elem){
elemento = elem;
prox = null;
}
}
ListaLigada ()
{
primeiro = null;
ultimo = null;
nroNos = 0;
}
public boolean
isVazia() {
return (primeiro ==
null && ultimo == null);
}
public void
addInicio(Object o) {
nroNos++;
No novoNo = new
No(o);
if (isVazia())
ultimo =
novoNo;
else
novoNo.prox =
primeiro;
primeiro = novoNo;
}
public void
addFinal(Object o) {
nroNos++;
No novoNo = new
No(o);
if (isVazia())
primeiro =
novoNo;
else
ultimo.prox =
novoNo;
ultimo = novoNo;
}
addInicio(novoNo);
return;
}
if (posicao >
nroNos) { //Outra abordagem
seria lançar exceção para
posição inválida
(>nroNos+1)
addFinal(novoNo);
return;
}
No noTemp =
primeiro.prox;
for(int
posAux=1;posAux<posicao;pos
Aux++)
noTemp =
noTemp.prox;
novoNo.prox =
(noTemp.prox).prox;
noTemp.prox =
novoNo;
}
public void
Remover(Object elemento)
{
No noTemp =
primeiro;
No noAnt = null;
if
(primeiro.elemento.equals(e
lemento)) {
primeiro =
primeiro.prox;
nroNos--;
}
else {
while (noTemp
!=null &&
!noTemp.elemento.equals(ele
mento)) {
noAnt =
noTemp;
noTemp =
noTemp.prox;
}
if(noTemp !=
null) {
noAnt.prox
= noTemp.prox;
nroNos--;
}
if(noTemp ==
ultimo) {
ultimo =
noAnt;
}
}
}
public Object
BuscarElemento (Object
elemento)
{
int i = 1;
No noTemp =
primeiro;
while (noTemp
!=null) {
if(noTemp.elemento.equals(e
lemento)) {
return
noTemp;
}
i = i +1;
noTemp =
noTemp.prox;
}
return null;
}
}
Exemplo em Pascal
program Lista_ligada;
uses crt;
type
Tdado = char;
Tptr = ^Tnode;
Tnode = record
prox: Tptr;
info: Tdado;
end;
procedure exibe(ptr:Tptr);
var
aux:Tptr;
begin
aux := ptr;
if (aux = NIL) then
writeln('A lista está
vazia.') else
begin
while (aux^.prox <>
NIL) do
begin
writeln(aux^.info);
aux := aux^.prox;
end;
writeln(aux^.info);
end;
readkey;
end;
procedure insereInicio(var
ptr:Tptr; v:char);
var
aux:Tptr;
begin
if (ptr <> NIL) then
begin
new(aux);
aux^.info := v;
aux^.prox := ptr;
ptr := aux;
end else
begin
new(ptr);
ptr^.info := v;
ptr^.prox := NIL;
end;
end;
procedure insereFinal(var
ptr:Tptr; v:char);
var
aux: Tptr;
nova: Tptr;
begin
aux := ptr;
if (aux = NIL) then
writeln('Lista está
vazia.') else
begin
while (aux^.prox <>
NIL) do
aux := aux^.prox;
new(nova);
nova^.info := v;
nova^.prox := NIL;
aux^.prox := nova;
end;
end;
procedure remove(var
ptr:Tptr; v:char);
var
aux:Tptr;
aux2:Tptr;
begin
if (ptr = NIL) then
writeln('A lista está
vazia.') else
begin
aux := ptr;
if (aux^.info = v) then
begin
ptr := ptr^.prox;
dispose(aux);
end;
while (aux^.prox <>
NIL) do
begin
if (aux^.prox^.info =
v) then
begin
aux2 := aux^.prox;
aux^.prox :=
aux2^.prox;
dispose(aux2);
end;
aux := aux^.prox;
end;
end;
end;
Ver também
Lista
Lista duplamente ligada
Obtida de "https://pt.wikipedia.org/w/index.php?
title=Lista_ligada&oldid=64758546"
Esta página foi editada pela última vez às
12h11min de 17 de novembro de 2022. •
Conteúdo disponibilizado nos termos da CC BY-SA
4.0 , salvo indicação em contrário.