Introducció a les Llistes Circulars
Les llistes circulars són una variació de les llistes enllaçades on l'últim node apunta al primer node, creant així una estructura circular. Aquesta característica permet que es pugui navegar per la llista de manera contínua sense arribar mai a un punt final.
Característiques de les Llistes Circulars
- Circularitat: L'últim node apunta al primer node.
- No tenen cap ni cua: No hi ha un punt d'inici o final definit, es pot començar des de qualsevol node.
- Navegació contínua: Es pot recórrer la llista indefinidament.
Tipus de Llistes Circulars
Hi ha dos tipus principals de llistes circulars:
- Llista Circular Simplement Enllaçada: Cada node té un enllaç al següent node, i l'últim node enllaça al primer.
- Llista Circular Doblement Enllaçada: Cada node té enllaços tant al següent com al node anterior, i l'últim node enllaça al primer i viceversa.
Implementació de Llistes Circulars
Llista Circular Simplement Enllaçada
Estructura del Node
Creació de la Llista Circular
class CircularLinkedList: def __init__(self): self.head = None def append(self, data): new_node = Node(data) if not self.head: self.head = new_node self.head.next = self.head else: temp = self.head while temp.next != self.head: temp = temp.next temp.next = new_node new_node.next = self.head def display(self): nodes = [] temp = self.head if self.head: while True: nodes.append(temp.data) temp = temp.next if temp == self.head: break print(" -> ".join(map(str, nodes))) # Exemple d'ús cll = CircularLinkedList() cll.append(1) cll.append(2) cll.append(3) cll.display() # Sortida: 1 -> 2 -> 3
Llista Circular Doblement Enllaçada
Estructura del Node
Creació de la Llista Circular
class CircularDoublyLinkedList: def __init__(self): self.head = None def append(self, data): new_node = Node(data) if not self.head: self.head = new_node self.head.next = self.head self.head.prev = self.head else: tail = self.head.prev tail.next = new_node new_node.prev = tail new_node.next = self.head self.head.prev = new_node def display(self): nodes = [] temp = self.head if self.head: while True: nodes.append(temp.data) temp = temp.next if temp == self.head: break print(" <-> ".join(map(str, nodes))) # Exemple d'ús cdll = CircularDoublyLinkedList() cdll.append(1) cdll.append(2) cdll.append(3) cdll.display() # Sortida: 1 <-> 2 <-> 3
Avantatges i Desavantatges de les Llistes Circulars
Avantatges
- Navegació contínua: Ideal per aplicacions que requereixen un recorregut cíclic.
- No hi ha nodes nuls: Sempre es pot accedir a un node següent.
Desavantatges
- Complexitat: La implementació i manteniment poden ser més complicats que les llistes enllaçades lineals.
- Accés aleatori: No és eficient per accedir a elements de manera aleatòria.
Exercicis Pràctics
Exercici 1: Inserció en una Llista Circular
Implementa una funció per inserir un node en una posició específica d'una llista circular simplement enllaçada.
Exercici 2: Eliminació en una Llista Circular
Implementa una funció per eliminar un node específic d'una llista circular doblement enllaçada.
Exercici 3: Cerca en una Llista Circular
Implementa una funció per cercar un element en una llista circular i retornar la seva posició.
Solucions als Exercicis
Solució a l'Exercici 1
def insert_at_position(cll, data, position): new_node = Node(data) if position == 0: new_node.next = cll.head temp = cll.head while temp.next != cll.head: temp = temp.next temp.next = new_node cll.head = new_node else: temp = cll.head for _ in range(position - 1): temp = temp.next new_node.next = temp.next temp.next = new_node
Solució a l'Exercici 2
def delete_node(cdll, key): temp = cdll.head if temp.data == key: if temp.next == cdll.head: cdll.head = None else: tail = cdll.head.prev cdll.head = temp.next cdll.head.prev = tail tail.next = cdll.head else: while temp.next != cdll.head: if temp.next.data == key: temp.next = temp.next.next temp.next.prev = temp break temp = temp.next
Solució a l'Exercici 3
def search(cll, key): temp = cll.head position = 0 while True: if temp.data == key: return position temp = temp.next position += 1 if temp == cll.head: return -1
Conclusió
Les llistes circulars són una eina poderosa per a certes aplicacions que requereixen una navegació contínua. Tot i que poden ser més complexes de gestionar que les llistes enllaçades lineals, ofereixen avantatges significatius en termes de navegació i accessibilitat. Amb la pràctica i la comprensió dels seus conceptes bàsics, es poden implementar de manera efectiva en diversos contextos de programació.
Curs d'Estructures de Dades
Mòdul 1: Introducció a les Estructures de Dades
- Què són les Estructures de Dades?
- Importància de les Estructures de Dades en la Programació
- Tipus d'Estructures de Dades
Mòdul 2: Llistes
- Introducció a les Llistes
- Llistes Enllaçades
- Llistes Doblement Enllaçades
- Llistes Circulars
- Exercicis amb Llistes
Mòdul 3: Piles
- Introducció a les Piles
- Operacions Bàsiques amb Piles
- Implementació de Piles
- Aplicacions de les Piles
- Exercicis amb Piles
Mòdul 4: Cues
- Introducció a les Cues
- Operacions Bàsiques amb Cues
- Cues Circulars
- Cues de Prioritat
- Exercicis amb Cues
Mòdul 5: Arbres
- Introducció als Arbres
- Arbres Binàries
- Arbres Binàries de Cerca
- Arbres AVL
- Arbres B
- Exercicis amb Arbres
Mòdul 6: Grafs
- Introducció als Grafs
- Representació de Grafs
- Algoritmes de Cerca en Grafs
- Algoritmes de Camins Mínims
- Aplicacions dels Grafs
- Exercicis amb Grafs