You are on page 1of 5

CUESTIONARIO 1

A. Defina qu son las estructuras de datos lineales y qu son las estructuras de datos no lineales
explicando la diferencia entre ambas.

Estructuras lineales: Una estructura lineal de datos o lista est conformada por ninguno, uno o
varios elementos que tienen una relacin de adyacencia ordenada donde existe un primer
elemento, seguido de un segundo elemento y as sucesivamente hasta llegar al ltimo. El tipo de
dato de los elementos puede ser cualquiera, pero debe ser el mismo tipo para todos. El valor
contenido en los elementos puede ser el mismo o diferente.

Las estructuras lineales de datos se caracterizan porque sus elementos estn en secuencia,
relacionados en forma lineal, uno luego del otro. Cada elemento de la estructura puede estar
conformado por uno o varios subelementos o campos que pueden pertenecer a cualquier tipo de
dato, pero que normalmente son tipos bsicos.

Estructuras no lineales: Son aquellas que ocupan bloques de memoria no continuos/lineales.


Para lidiar con el problema de la fragmentacin, y sobre todo del crecimiento dinmico. Los
bloques deben estar enlazados unos con otros para poder navegar por la estructura, es decir,
tener acceso a otro(s) dato(s) a partir del actual. A las estructuras de datos no lineales se les llama
tambin estructuras de datos multienlazadas. Cada elemento puede estar enlazado a cualquier
otro componente.

Estructuras de datos lineales. Cada componente tiene un nico sucesor y un nico predecesor
con excepcin del ltimo y el primero.

Estructura de datos no lineal. Cada componente puede tener varios sucesores y varios
predecesores.

Algoritmos y estructuras de datos pg. 1


B. Complete el siguiente cuadro sinptico investigando en internet los siguientes conceptos
relacionados con las estructuras de datos dinmicas:
ESTRUCTURA Definicin y Ejemplo de cdigo en C++ donde se Explique para qu sirve el cdigo con sus
funcionamiento utilice la estructura propias palabras
(Para llenar ste (Busque un ejemplo donde se utilice (Explique en base a su investigacin para
apartado deber explicar la estructura e incluya la declaracin qu sirve el cdigo de la columna anterior)
qu es la estructura y inicial de la misma as como una o
cmo funciona) ms funciones donde se aprecien las
operaciones bsicas que se pueden
llevar a cabo con ella (por ejemplo
aadir elementos, buscar elementos,
borrar, recorrer etc.).
LISTA Estructura lineal void Insertar(Lista *lista, int v) {
compuesta por una pNodo nuevo, anterior; En este ejemplo hacemos:
secuencia de 0 o ms
elementos de algn tipo nuevo = 1: Crear un nodo nuevo
determinado y ordenados (pNodo)malloc(sizeof(tipoNodo)); 2: Si la lista esta vaca se aade la lista a
de alguna forma. Puede nuevo->valor = v; continuacin del nuevo nodo.
crecer o disminuir en el
nmero de elementos y if(ListaVacia(*lista) || (*lista)->valor > 3: El comienzo de nuestra lista es el nuevo
podrn insertarse o v) { nodo.
eliminarse elementos en nuevo->siguiente = *lista;
cualquier posicin sin 4. Busca el nuevo nodo con valor menor a v.
alterar su orden lgico. *lista = nuevo; Avanzamos hasta el ltimo elemento o hasta
} else { que el siguiente tenga un valor mayor que v.

anterior = *lista; 5. Insertamos el nuevo nodo despus del nodo


anterior
while(anterior->siguiente &&
anterior->siguiente->valor <= v)
anterior = anterior->siguiente;

nuevo->siguiente = anterior-
>siguiente;
anterior->siguiente = nuevo;
}
}
PILA
Estructura lineal de datos void Push(Pila *pila, int v) { 1- Se crea un nuevo nodo
compuesta por una pNodo nuevo; 2- Se aade la pila a continuacin del
secuencia de elementos nuevo = nuevo nodo.
en la que las operaciones (pNodo)malloc(sizeof(tipoNodo)); 3- El comienzo de la pila es el nuevo
slo se pueden realizar nuevo->valor = v; nodo
por uno de sus extremos
llamado cima (tope o top). nuevo->siguiente = *pila;
Estructuras de tipo LIFO *pila = nuevo;
(Last In-First Out). Se }
utiliza para poder
recuperar elementos en
orden inverso a como
entran.

Algoritmos y estructuras de datos pg. 2


COLA
Estructura lineal de datos void Anadir(pNodo *primero, pNodo 1. Creamos un nuevo nodo para el valor
compuesta por un *ultimo, int v) { que ira en la cola
conjunto de elementos pNodo nuevo; 2. Si la cola no esta vacia, aadimos el
en la que la adicin de nuevo a continuacin del ultimo.
nuevos elementos se har nuevo = 3. Ahora el ultimo elemento de la cola
por un extremo de (pNodo)malloc(sizeof(tipoNodo)); es el ultimo nodo.
la cola,final(rear), y la nuevo->valor = v; 4. Si el primero esta vacio hacemos que
salida de elementos por el nuevo->siguiente = NULL; apunte al nuevo nodo.
contrario, if(*ultimo) (*ultimo)->siguiente =
principio(front). nuevo;
*ultimo = nuevo;
Estructura de datos de if(!*primero) *primero = nuevo;
tipo FIFO (first in-first out), }
es decir el
primer elemento en entrar
es el primero en salir.
primer elemento en entrar
es el primero en salir.
En aplicaciones
informticas se utiliza para
controlar procesos que
tengan que realizarse en
un cierto orden (colas
deimpresin, colas
de prioridades, etc.)

cisARBOL Un rbol es una estructura void Insertar(Arbol *a, int dat) {


1. Padre = NULL
BINARIO de datos homognea, pNodo padre = NULL; /* (1) */
dinmica y no lineal, en la pNodo actual = *a; /* (2) */ 2. nodo = Raiz
que cada nodo (elemento)
puede tener varios nodos while(!Vacio(actual) && dat != actual- 3. Bucle: mientras actual no sea
un rbol vaco o hasta que se
posteriores, pero slo >dato) { /* (3) */
puede tener un nodo padre = actual; encuentre el elemento.
anterior. if(dat < actual->dato) actual = a. Si el valor del
Un rbol es dinmico actual->izquierdo; /* (3-a) */ nodo raz es
porque su estructura else if(dat > actual->dato) actual = mayor que el
puede cambiar durante la actual->derecho; /* (3-b) */ elemento que
ejecucin de un programa. } buscamos,
Y no lineal, ya que cada continuaremos
nodo del rbol puede if(!Vacio(actual)) return; /* (4) */ la bsqueda
contener varios nodos que if(Vacio(padre)) { /* (5) */ en el rbol
dependan de l. *a = izquierdo:
(Arbol)malloc(sizeof(tipoNodo)); Padre=nodo,
(*a)->dato = dat; nodo=nodo-
(*a)->izquierdo = (*a)->derecho = >izquierdo.
NULL;
} b. Si el valor del
else if(dat < padre->dato) { /* (6) */ nodo raz es
actual = menor que el
(Arbol)malloc(sizeof(tipoNodo)); elemento que
padre->izquierdo = actual; buscamos,
actual->dato = dat; continuaremos
actual->izquierdo = actual->derecho la bsqueda
= NULL; en el rbol
} derecho:

Algoritmos y estructuras de datos pg. 3


else if(dat > padre->dato) { /* (7) */ Padre=nodo,
actual = nodo=nodo-
(Arbol)malloc(sizeof(tipoNodo)); >derecho.
padre->derecho = actual;
4. Si nodo no es NULL, el
actual->dato = dat;
elemento est en el rbol, por
actual->izquierdo = actual->derecho
lo tanto salimos.
= NULL;
} 5. Si Padre es NULL, el rbol
} estaba vaco, por lo tanto, el
nuevo rbol slo contendr el
nuevo elemento, que ser la
raz del rbol.
6. Si el elemento es menor que el
Padre, entonces insertamos el
nuevo elemento como un
nuevo rbol izquierdo de
Padre.
7. Si el elemento es mayor que el
Padre, entonces insertamos el
nuevo elemento como un
nuevo rbol derecho de Padre.

GRAFO se pueden definir como un struct nodo{ 1. Creamos un nuevo nodo


conjunto de vrtices y un int dato; 2. Si el nodo este vaco creamos un nuevo
conjunto de aristas. Cada struct nodo *sigt; vrtice.
arista es un par (u,v), struct nodo *ady; 3. Ahora se inserta un nuevo vrtice al grafo
donde u y v pertenecen al
conjunto de vrtices. Si }
este par es ordenado el
grafo es dirigido. void insertar(nodo**grafo, int aux){
En los grafos, como en if(grafo==NULL){
todas las estructuras de
datos, las dos *grafo=CrearNodo(aux);
operaciones bsicas son }
insertar y borrar. En este
caso, cada una de ellas se else if (((grafo*)->dato)<aux){
desdobla en dos, para grafo=CrearNodo(&((grafo)-
insertar/eliminar vrtices e >izq),aux)
insertar/eliminar aristas. else
insertar(&(grafo->der),aux);
}
}

Algoritmos y estructuras de datos pg. 4


C. Defina a qu se refiere el trmino RECURSIVIDAD en programacin. Mencione 2 tipos de
planteamientos que se resuelven usando sta tcnica.

Se dice que una funcin es recursiva cuando se define en funcin de si misma.


No todas las funciones pueden llamarse a si mismas, sino que deben estar diseadas especialmente
para que sean recursivas, de otro modo podran conducir a bucles infinitos, o a que el programa
termine inadecuadamente.
Tampoco todos los lenguajes de programacin permiten usar recursividad.
C++ permite la recursividad. Cada vez que se llama a una funcin, se crea un juego de variables
locales, de este modo, si la funcin hace una llamada a si misma, se guardan sus variables y
parmetros, usando la pila, y la nueva instancia de la funcin trabajar con su propia copia de las
variables locales. Cuando esta segunda instancia de la funcin retorna, recupera las variables y los
parmetros de la pila y continua la ejecucin en el punto en que haba sido llamada.
Por ejemplo:
Prodramos crear una funcin recursiva para calcular el factorial de un nmero entero.
El factorial se simboliza como n!, se lee como "n factorial", y la definicin es:
n! = n * (n-1) * (n-2) * ... * 1
Hay algunas limitaciones:
No es posible calcular el factorial de nmeros negativos, no est definido.
El factorial de cero es 1.
De modo que una funcin bien hecha para clculo de factoriales debera incluir un control para esos
casos:

/* Funcin recursiva para clculo de factoriales */


int factorial(int n) {
if(n < 0) return 0;
else if(n > 1) return n*factorial(n-1); /* Recursividad */
return 1; /* Condicin de terminacin, n == 1 */
}

Existen otras formas de implementar algoritmos recursivos, no es necesario que una funcin se
invoque a si misma.
Por ejemplo, un par de funciones A y B pueden crear un algoritmo recursivo si la funcin A invoca a la
funcin B, y esta a su vez invoca a la funcin A.
Este mismo mecanismo se puede implementar con tres, cuatro o con cualquier nmero de funciones.

Algoritmos y estructuras de datos pg. 5

You might also like