UNIVERSIDAD PÚBLICA DE EL ALTO
CARRERA INGENIERIA DE SISTEMAS
ESTRUCTURA DE DATOS
APELLIDOS Y NOMBRES: MEDINA LIMACHI DAMARIS ESTHER
M
FECHA: / /24 PARALELO: 3 “B”. CI: 13022131. INICIAL AP.
PRACTICA #3
LISTAS DOBLES NORMALES
2. Dada lista doble normal, llevar el primer nodo al final de la lista
CODIGO EJECUCION
def llevarPrimerNodoAlFinal(self):
if self.LD is not None and self.LD.sigte is
not None:
r = self.LD
self.LD = r.sigte
self.LD.ant = None
actual = self.LD
while actual.sigte is not None:
actual = actual.sigte
actual.sigte = r
r.ant = actual
r.sigte = None
4. Dada dos listas dobles normal, realizar la unión de ambas listas en tercera lista, en la lista no
existe elementos repetidos
def unionSinRepetidos(self, Lista2):
Lista3 = ListaDoble()
r = self.LD
while r is not None:
Lista3.adicionaFinal(r.dato)
r = r.sigte
w = Lista2.LD
while w is not None:
Lista3.adicionaFinal(w.dato)
w = w.sigte
Lista3.eliminarRepetidos()
return Lista3
6 Dada lista doble normal, eliminar el nodo k-ésimo de la lista
def eliminarNodoKesimo(self, k):
if self.LD is not None:
r = self.LD
contador = 1
while r is not None and contador < k:
r = r.sigte
contador += 1
if r is not None:
if r == self.LD:
self.eliminaInicio()
elif r.sigte is None:
self.eliminaFinal()
else:
r.ant.sigte = r.sigte
r.sigte.ant = r.ant
else:
print("No se encontró el nodo k-ésimo en la
lista.")
else:
print("Lista Vacia...")
8 Dada una lista doble normal, insertar un elemento X antes del primer elemento par.
def insertarAntesPrimerPar(self, X):
if self.LD is not None:
r = self.LD
while r is not None:
if r.dato % 2 == 0:
self.adicionaAntes(X, r.dato)
break
r = r.sigte
if r is None:
print("No se encontró un número
par en la lista.")
else:
print("Lista Vacia...")
10 Dada una lista doble intercambiar el primer elemento con el último elemento
def intercambia(self):
if self.LD is not None:
r = self.LD
while r.sigte is not None:
r = r.sigte
z = r.ant
w = self.LD
self.LD = r
self.LD.sigte = w.sigte
w.sigte.ant = self.LD
self.LD.ant = None
z.sigte = w
w.ant = z
w.sigte = None
12. Una lista doble dividir en dos listas a partir del nodo k-ésimo. Donde k es dado por el
def dividirListaEnDos(self, k):
lista1 = ListaDoble()
lista2 = ListaDoble()
if self.LD is not None:
aux = self.LD
contador = 1
while aux is not None:
if contador <= k:
lista1.adicionaFinal(aux.dato)
else:
lista2.adicionaFinal(aux.dato)
aux = aux.sigte
contador += 1
else:
print("Lista Vacia...")
return lista1, lista2
14. En una lista doble generar la siguiente serie s=3 1 , 32 , 33 , 34 , 35 3 6 , 37 , 38 , 39 , 310
def
generarSerie(self, n):
for i in range(1,
n + 1):
self.adicionaFi
nal(3 ** i)
16. Dada una lista doble normal, mostrar todos los elementos que son puntos silla. Se considera a
un elemento V(i) como punto silla, si se cumple la siguiente condición: V(i-1) < V(i) < V(i+1).
def puntosSilla(self):
puntos_silla = ListaDoble()
if self.LD is None or self.LD.sigte is None
or self.LD.sigte.sigte is None:
print("Lista vacía o insuficiente para
encontrar puntos silla...")
else:
aux = self.LD.sigte
while aux.sigte is not None:
print(f"Comparando: {aux.ant.dato}
< {aux.dato} < {aux.sigte.dato}")
if aux.ant.dato < aux.dato <
aux.sigte.dato:
puntos_silla.adicionaFinal(aux.da
to)
aux = aux.sigte
if puntos_silla.LD is None:
print("No se encontraron puntos
silla en la lista.")
return puntos_silla
LISTAS CRICULARES DOBLES
2. Dada una lista contar cuantos elementos múltiplos de x existen
def
contarMultiploX(self,x)
:
c=0
if
self.L!=None:
r=self.L
while
r.sigte!=self.L:
if
r.dato%x==0:
c=c+1
r=r.sigte
if
r.dato%x==0:
c=c+1
print("Total
multiplos:",c)
4. Dada una lista doble circular eliminar los elementos repetidos de la lista
def eliminaRepetidos(self):
if self.L!=None:
r=self.L
while r.sigte!=self.L:
w=r.sigte
while w.sigte!=self.L:
if r.dato==w.dato:
w.ant.sigte =
w.sigte
w.sigte.ant=
w.ant
w=r.sigte
w=w.sigte
if r.dato==w.dato:
self.eliminaFinal()
r=r.sigte
def insertax(self,x,y):
if self.L!=None:
r=self.L
while r.sigte!=self.L:
if r.dato==y:
q=NodoLD()
q.dato=x
r.sigte.ant=q
q.sigte = r.sigte
r.sigte = q
q.ant =r
r=r.sigte.sigte
else:
r=r.sigte
if r.dato==y:
self.adicionaFinal(x)
6. Dada una lista doble circular insertar un elemento x después de cada elemento Y, si existe
def insertax(self,x,y):
if self.L!=None:
r=self.L
while
r.sigte!=self.L:
if r.dato==y:
q=NodoLD()
q.dato=x
r.sigte.ant=q
q.sigte =
r.sigte
r.sigte = q
q.ant =r
r=r.sigte.sigte
else:
r=r.sigte
if r.dato==y:
self.adicionaFinal(x)
8. Insertar un elemento x en una lista doble circular, en el lugar que le corresponde
def insertaXordenado(self, x):
q = NodoLD()
q.dato = x
if self.esta_vacia():
q.sigte = q
q.ant = q
self.L = q
else:
r = self.L
while r.sigte != self.L
and r.dato < x:
r = r.sigte
if r == self.L:
self.adicionaInicio(x)
else:
if r.sigte ==
self.L and r.dato < x:
self.adicionaFinal(x)
else:
r.ant.sigte = q
q.ant = r.ant
q.sigte = r
r.ant = q
10.Dada una listar doble circular donde se almacena elementos de tipo String (cadenas), contar
cuantos elementos son palíndromo (un palíndromo es una palabra, frase, número o cualquier
secuencia de caracteres que se lee de la misma manera hacia adelante y hacia atrás. Ej. “ORURO”),
en este ejercicio debe realizar todas las operaciones básicas (adición, eliminación, listado)
def contarPalindromos(self):
if self.esta_vacia():
return 0
contador = 0
r = self.L
while True:
if
self.esPalindromo(r.dato):
contador += 1
r = r.sigte
if r == self.L:
break
return contador
def esPalindromo(self, cadena):
# Eliminamos espacios y
convertimos a minúsculas para
comparar
cadena =
cadena.lower().replace(" ", "")
return cadena == cadena[::-1]
12.En una lista doble circular, almacenar datos de un producto(cod, descripción, marca, cantidad,
precio) y realizar las siguientes operaciones.
Adicionar productos
Eliminar un x producto
Buscar un producto x por código
Llevar a otra lista simple los productos cuya cantidad sea igual a 0
Listar todos los productos
def buscarCodigo(self):
cod=input("codigo a
buscar")
s=""
if self.L!=None:
r=self.L
while
r.sigte!=self.L:
if
cod==r.dato.getId():
s=s+r.dato.getTodo()
r=r.sigte
if
cod==r.dato.getId():
s=s+r.dato.getTodo()
return s
def llevarCant0(self):
listaS=ListaSimpleP()
if self.L!=None:
r=self.L
while
r.sigte!=self.L:
if
r.dato.getCant()=="0":
listaS.adicionaFinal(r.dato)
r=r.sigte
if
r.dato.getCant()=="0":
listaS.adicionaFinal(r.dato)
14.Dada una lista doble circular, sumar los pares e impares por separado, y obtener la media
aritmética….
def sumaParImpar(self):
Sp=0
Si=0
cp=0
ci=0
if self.L!=0:
r=self.L
while r.sigte!=self.L:
if r.dato%2==0:
Sp=Sp+r.dato
cp=cp+1
else:
Si=Si+r.dato
ci=ci+1
r=r.sigte
if r.dato%2==0:
Sp=Sp+r.dato
cp=cp+1
else:
Si=Si+r.dato
ci=ci+1
pp=Sp/cp
pi=Si/ci
print("el promedio de
pares:",pp)
print("el promedio de
impares:",pi)