Está en la página 1de 10

4.1.

CAPTULO IV: ESTRUCTURAS DE DATOS COMPLEJAS


4.1 Listas Generalizadas 4.1.1 Conceptos Son cualquier sucesin finita de elementos a1, ... , an. ai puede ser: un tomo o una lista. Los elementos ai que no son tomos se denominan sub-listas. Una lista se define recursivamente por: a1, Cabeza (Head) Ejemplos: 1) A= ( ) 2) A= (a) a2, ..., an Cola (Tail)

4.1. 2

3) A= ( ( a ) )

a a

4) A= ( a, (b, c, d), e, (f, g) )

head( A ) = a tail( A ) = (( b, c, d ), e, ( f, g ) ) 5) A=( a, ( b, c) ) B=( A, A, ( ) ) 6) C=( a, C)

4.1. 3

Formato del nodo

INFO=0 indica que nodo contiene dato en DATO. INFO=1 indica que nodo contiene en DATO un puntero a LISTA Ejemplos 1) A = ( ( a ) )

2) A = ( a, ( b, c) )

3) B = ( a, b, c )

4) Representar : C = ( ( a, b ), c )

4.1. 4

4.1.2 Ejemplo de aplicacin P( X, Y, Z ) = X10Y3Z2 + 2X8Y3Z2 + 3X8Y2Z2 + X4Y4Z + 6X3Y4Z + 2YZ Formato del nodo para un polinomio usando una lista con nexos tradicional

Desventaja Estos nodos tendrn que poder cambiar de tamao, dependiendo del nmero de variables. Uso de lista generalizada para representar el polinomio Reescribir P( X, Y, Z ) como: (( X10 + 2X8 ) Y3 + 3X8Y2 ))Z2 + ((X4 + 6X3 )Y4 + 2Y)Z Z coeficiente
n

exponente

Cada coeficiente es en s mismo un polinomio (en una variable menos) si consideramos un nico coeficiente numrico como un polinomio en variable cero.

4.1. 5

Representacin de P( X, Y, Z ) usando una lista generalizada

Cmo distinguimos entre coeficientes y un puntero a otra lista? La solucin es agregar otro campo llamado TAG: Ser cero si el campo contiene un coeficiente y Ser uno, de otra manera. Ejemplo El polinomio P = 3X2Y podra ser representado como:

4.1. 6

TAG es 1 en los nodos que contienen X e Y. Tambin permite distinguir entre un nombre de variable y una constante. Ejemplo P(x,y,z) = ((x10 + 2x8) y3 + 3x8y2) z2 + ((x4 + 6x3) y4 + 2y) z P(x,y,z)
1 z 0 1 2 1 1 0 1 4 1 x 0 1 y 0 1 3 1 2 0 0 3 8 0 1 1 x 0 0 1 44 1 0 0 2 0 0 0 6 3 0 1 y 0

1 x 0

1 x 0

0 1 10

0 2 8 0

Lista generalizada que representa al polinomio 3x2y


trio
vble exp

link

trio dlink exp

link

var

ptr

P
var x 0

link

link

no

4.1. 7

Si trio == var, entonces el nodo es head de la lista. vble es utilizado para identificar el nombre de la variable. exp es 0. Si trio == ptr, entonces el coef es apuntador a otra lista. Si trio == no, entonces el coeficiente es un entero y es almacenado. mencionado. Formato del nodo tag = FALSE / TRUE dato / dLink Link En ambos casos, se coloca el exponente

class GenLista; //Definicin de clase class GenLista Nodo { friend class GenLista; private: GenListaNodo *Link; Bool tag; union { char dato; GenListaNodo *dLink; }; }; class GenLista { public: //Listado de mtodos de comportamiento private:

4.1. 8

}; Ejemplos: D= 0

GenListaNodo *primero;

A = (a, (b,c))

B = (A, A, ())

C = (a, C)

4.1. 9

4.1.3 Algoritmos Copiar una lista void GenLista::Copiar(const GenLista & L) { primero = Copiar(L.primero); } GenListaNodo* GenLista::Copiar(GenListaNodo *p) { GenListaNodo *q = 0; if (p) { q = new GenListaNodo; q tag = p tag; if (!p tag) q dato = p dato; else q dLink = Copiar (p dLink); q Link = Copiar (p Link); } }

4.1.10

Ejercicios propuestos: Un algoritmo para ver si dos listas son idnticas. Algoritmo para calcular la profundidad de una lista. La profundidad de una lista vaca es cero y en general: depth(s) 0 si S es tomo (x1, ..., xn), n 1 1 + max{depth(x), ..., depth(xn)} si S es la lista

4.1.4. Contador de referencias y caso de listas que son compartidas por otras listas

Ver Horowitz

También podría gustarte