En aquesta secció, posarem en pràctica els conceptes apresos sobre les llistes. Els exercicis estan dissenyats per reforçar la comprensió de les llistes enllaçades, les llistes dobles enllaçades i les llistes circulars. Cada exercici inclou una descripció del problema, un exemple de codi i una solució detallada.
Exercici 1: Implementació d'una Llista Enllaçada
Descripció
Implementa una llista enllaçada simple en Python. La llista ha de permetre les operacions bàsiques següents:
- Inserir un element al final de la llista.
- Eliminar un element de la llista.
- Cercar un element a la llista.
- Imprimir tots els elements de la llista.
Exemple de Codi
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def insert(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
else:
current = self.head
while current.next:
current = current.next
current.next = new_node
def delete(self, key):
current = self.head
previous = None
while current and current.data != key:
previous = current
current = current.next
if current is None:
return
if previous is None:
self.head = current.next
else:
previous.next = current.next
def search(self, key):
current = self.head
while current and current.data != key:
current = current.next
return current is not None
def print_list(self):
current = self.head
while current:
print(current.data, end=" -> ")
current = current.next
print("None")
# Exemple d'ús
llista = LinkedList()
llista.insert(1)
llista.insert(2)
llista.insert(3)
llista.print_list() # Output: 1 -> 2 -> 3 -> None
print(llista.search(2)) # Output: True
llista.delete(2)
llista.print_list() # Output: 1 -> 3 -> NoneSolució Detallada
- Node Class: La classe
Noderepresenta un node de la llista enllaçada. Cada node conté dades (data) i un punter al següent node (next). - LinkedList Class: La classe
LinkedListgestiona les operacions de la llista enllaçada.- insert: Afegeix un nou node al final de la llista.
- delete: Elimina el primer node que conté el valor especificat.
- search: Cerca un node amb el valor especificat.
- print_list: Imprimeix tots els elements de la llista.
Exercici 2: Implementació d'una Llista Doblement Enllaçada
Descripció
Implementa una llista dobles enllaçada en Python. La llista ha de permetre les operacions bàsiques següents:
- Inserir un element al final de la llista.
- Eliminar un element de la llista.
- Cercar un element a la llista.
- Imprimir tots els elements de la llista.
Exemple de Codi
class Node:
def __init__(self, data):
self.data = data
self.next = None
self.prev = None
class DoublyLinkedList:
def __init__(self):
self.head = None
def insert(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
else:
current = self.head
while current.next:
current = current.next
current.next = new_node
new_node.prev = current
def delete(self, key):
current = self.head
while current and current.data != key:
current = current.next
if current is None:
return
if current.prev is None:
self.head = current.next
else:
current.prev.next = current.next
if current.next:
current.next.prev = current.prev
def search(self, key):
current = self.head
while current and current.data != key:
current = current.next
return current is not None
def print_list(self):
current = self.head
while current:
print(current.data, end=" <-> ")
current = current.next
print("None")
# Exemple d'ús
llista = DoublyLinkedList()
llista.insert(1)
llista.insert(2)
llista.insert(3)
llista.print_list() # Output: 1 <-> 2 <-> 3 <-> None
print(llista.search(2)) # Output: True
llista.delete(2)
llista.print_list() # Output: 1 <-> 3 <-> NoneSolució Detallada
- Node Class: La classe
Noderepresenta un node de la llista dobles enllaçada. Cada node conté dades (data), un punter al següent node (next) i un punter al node anterior (prev). - DoublyLinkedList Class: La classe
DoublyLinkedListgestiona les operacions de la llista dobles enllaçada.- insert: Afegeix un nou node al final de la llista.
- delete: Elimina el primer node que conté el valor especificat.
- search: Cerca un node amb el valor especificat.
- print_list: Imprimeix tots els elements de la llista.
Exercici 3: Implementació d'una Llista Circular
Descripció
Implementa una llista circular enllaçada en Python. La llista ha de permetre les operacions bàsiques següents:
- Inserir un element al final de la llista.
- Eliminar un element de la llista.
- Cercar un element a la llista.
- Imprimir tots els elements de la llista.
Exemple de Codi
class Node:
def __init__(self, data):
self.data = data
self.next = None
class CircularLinkedList:
def __init__(self):
self.head = None
def insert(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
new_node.next = self.head
else:
current = self.head
while current.next != self.head:
current = current.next
current.next = new_node
new_node.next = self.head
def delete(self, key):
if self.head is None:
return
if self.head.data == key:
if self.head.next == self.head:
self.head = None
else:
current = self.head
while current.next != self.head:
current = current.next
current.next = self.head.next
self.head = self.head.next
return
current = self.head
previous = None
while current.next != self.head and current.data != key:
previous = current
current = current.next
if current.data == key:
previous.next = current.next
def search(self, key):
if self.head is None:
return False
current = self.head
while True:
if current.data == key:
return True
current = current.next
if current == self.head:
break
return False
def print_list(self):
if self.head is None:
print("None")
return
current = self.head
while True:
print(current.data, end=" -> ")
current = current.next
if current == self.head:
break
print("HEAD")
# Exemple d'ús
llista = CircularLinkedList()
llista.insert(1)
llista.insert(2)
llista.insert(3)
llista.print_list() # Output: 1 -> 2 -> 3 -> HEAD
print(llista.search(2)) # Output: True
llista.delete(2)
llista.print_list() # Output: 1 -> 3 -> HEADSolució Detallada
- Node Class: La classe
Noderepresenta un node de la llista circular enllaçada. Cada node conté dades (data) i un punter al següent node (next). - CircularLinkedList Class: La classe
CircularLinkedListgestiona les operacions de la llista circular enllaçada.- insert: Afegeix un nou node al final de la llista.
- delete: Elimina el primer node que conté el valor especificat.
- search: Cerca un node amb el valor especificat.
- print_list: Imprimeix tots els elements de la llista.
Resum
En aquesta secció, hem treballat amb diferents tipus de llistes: llistes enllaçades, llistes dobles enllaçades i llistes circulars. Hem implementat operacions bàsiques com la inserció, l'eliminació, la cerca i la impressió d'elements. Aquests exercicis són fonamentals per entendre com funcionen les estructures de dades bàsiques i com es poden manipular en 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
