Documentos de Académico
Documentos de Profesional
Documentos de Cultura
mediante templates
Generar una lista que en los nodos contenga letras, un contador y un puntero a una
sublista.
La sublista contienen números y una letra (N, S, E, O) que representa una orientación
A 3 L 2 M 1
3 N 7 E 9 N
5 S 17 O
7 E
Abordaremos este problema mediante el uso de el tipo abstracto de datos Listas (TDAListas) mediante el uso de templates.
Consideremos que hablamos de una lista que contiene datos (letra, cantidad de hijos) y punteros (al siguiente de la lista, al primero de la
sublista).
Entonces, para acceder a la sublista de cada letra, se debe "apuntar" al nodo de la lista y de este tomar el puntero a la sublista. De forma
tal de poder utilizar todas las funciones de listas contenidas en el TDAListas.
Para lograr un mayo nivel de encapsulamiento, modificamos el TDAListas con el agregado de una variable "puntero actual" que "apunta"
al nodo actual (en la inserción al nuevo; en la eliminación a NULL) y las siguientes funciones:
bool próximo(), actualiza el puntero actual de manera que apunte al nodo siguiente al actual. En caso de estar en el último devuelve
false.
bool primero(), actualiza el puntero actual para que apunte al primer nodo de la lista.
bool traerActualInfo(TD & r), devuelve los datos del nodo apuntado por el puntero actual. En caso de ser NULL devuelve false
bool reemplazarActualInfo(TD r), modifica el contenido de los datos del nodo apuntado por el puntero actual. En caso de ser NULL
devuelve false
Mediante estas funciones se puede "manipular" una lista sin conocer absolutamente nada de su
implementación.
Vemos en un gráfico cómo funcionan los punteros y las funciones primero() y próximo()
Mediante el ptroActual y estas dos funciones podremos recorrer la lista sin necesidad de conocer nada
acerca de la implementación.
Las funciones traerActualInfo(TD() y reemplazarActualInfo(TD()
Es importante que queda muy claro la importancia de usar las funciones primero() y próximo() dado que para
cada nodo hay que, además de mostrar los datos, recorrer la sublista.
Recorrer la lista con la sublista
Tarea: Modificar este algoritmo pidiendo letras por la consola y armando la lista de
acuerdo a cada ingreso. Tener en cuenta que se debe mantener el 0 en cantidad de hijos y
el NULL en el puntero a la sublista.
¿Cómo se armó la subLista para el ejemplo?
void armarSubLista(TDALista <tRegLista> lista) {
Para armar la sublista se recorre la lista nodo a nodo. Para cada srand (time(NULL));
uno de los nodos, se agregan valores numéricos al azar entre 1 y char vOrientacion[4] = {'N', 'S', 'E', 'O'};
100. La cantidad de valores de cada nodo se define al azar (puede cout<<"armar sublista"<<endl;
TDALista <tRegLista> p = lista;
ser que algún nodo no reciba valores).
tRegLista rLista ;
Este proceso comienza con la función srand(time()) que tRegSubLista rSubLista ;
int cant;
permite generar números al azar (cada corrida diferenets int nro;
valores). char ori;
Define un vector con los puntos cardinales N, S, E y O. p.primero() ;
while (p.traerActualInfo(rLista)) {
cant = rand() % 10; // puede no agregar nada en algún caso
Los nodos hijos se calculan de la siguiente manera: mostrarLineaLista(rLista);
1. el número es al azar entre 1 y 100 for (int i=0; i<cant; i++) {
2. la orientación (N, S, E, O) es al azar nro = (rand() % 100 ) + 1; // número a agregar en la lista entre 1 y 100
ori = vOrientacion[rand() % 4] ; // orientación a agregar en la lista
cout<<"Insert en sublista "<<nro<<" orientacion "<<ori<<"\n";
Se recorre cada uno de los nodos de la lista. Para cada rSubLista = {nro, ori} ; // arma el registro a insertar
uno de los nodos se generan los hijos (entre 0 y N al azar). rLista.subLista.insertarOrdenado(rSubLista, criterioNumero) ;
rLista.cantHijos++; // actualiza la cantidad de hijos por cada hijo insertado
p.reemplazarActualInfo(rLista) ;
Prestar especial atención al uso de la función }
traerActualInfo() desde donde se obtiene el puntero a la p.proximo(); Tarea: Modificar este algoritmo para
sublista. } agregar hijos en los nodos a partir de datos
system("PAUSE"); pedidos por consola.
Mediante la función reemplazarActualInfo() se actualiza }
el puntero a la sublista y la cantidad de hijos Sug. Usar la función buscar() para
encontrar el nodo padre.
Usar la función buscar para encontrar un nodo. Modifica el puntero actual.
pNodoLista <TD> * buscar(TD d, int (*criterio)(TD,TD)) { void agregarSub(pNodoLista < tRegLista > * lista)
pNodoLista <TD> * q = cabLista; {
// en caso de encontrar devuelve el ptro, caso contrario devuelve NULL pNodoLista < tRegLista > * p;
tRegLista rLista ;
ptroActual = NULL ;
tRegSubLista rSubLista
if (cabLista!=NULL) { rLista.letra = 'A';
while ((q!=NULL) && (criterio(d, q->info)!=0))
q = q->pSig ; p = lista.buscar(r, criterioNombre) ;
if ((q!=NULL) && (criterio(d, q->info)==0)) { p.traerActualInfo(rLista); // trae el actual (buscado)
ptroActual = q ; // actualiza el ptroActual
return q ; rSubLista = {12, 'O') ;
} else return NULL ;
rLista.subLista.insertarOrdenado(rSubLista,
} else return NULL ;
criterioNumero) ;
}; // actualiza la cantidad de hijos y el ptro a sub
rLista.cantHijos++;
Esta función recorre la lista buscando el valor recibido de acuerdo al p.reemplazarActualInfo(rLista) ;
criterio recibido. Devuelve el puntero al nodo encontrado (si está) o }
NULL (sin no está). El algoritmo busca el nodo cuya letra es 'A'
e inserta en su sublista un nodo cuyo
Actualiza el ptorActual con la dirección del nodo si lo encuentra o NULL contenido es número = 12 y orientación =
su no está. 'O'.
Fin de la presentación.