S1:Estructura de datos

5
Universidad Andr´ es Bello Facultad de Ingenier´ ıa Ingenier´ ıa en Computaci´ on e Inform´ atica Estructura de Datos Solemne I Nombre: Nota: Profesores: Carlos Contreras Bolton – Jos´ e Luis Allende – Felipe Reyes Gonz´ alez Ayudantes: Carlos Rey – Daniela Ubilla – Tamara Sa´ ez Fecha: 22 de Abril del 2014 Instrucciones: Coloque su nombre a todas las hojas. Apague o silencie sus celulares. NO se podr´ a contestar llamadas ni visualizar el celular. Si se realiza una de las acciones anteriores obtendr´ a nota m´ ınima. Toda copia o intento de copia ser´ a calificada con nota m´ ınima. Tiene 90 minutos para realizar la prueba. 1 15 2 15 3 15 4 15 5 15 Suma: 75 +10 Nota: 85 Pregunta 1 (15 puntos) Realizar una funci´ on que imprima una lista de manera inversa usando recursividad y luego quite la recursividad usando pilas. 1 #i n c l u d e ”lista.h” 2 #i n c l u d e ”pila.h” 3 4 void imprimir lista inversa(Nodo * i) 5 { 6 if (i != NULL) 7 { 8 imprimir lista inversa(i - >siguiente); 9 printf(”%d ”, i - >datos - >dato1) ; 10 } 11 } 12 13 void imprimir lista inversa p i l a ( Nodo * i, Pila *p) 14 { 15 for (; i != NULL ; i = i - >siguiente) 16 apilar(p, i - >datos - >dato1) ; 17 18 while (!vacia(p)) 19 { 20 printf(”%d ”, tope(p)- >datos - >dato1) ; 21 desapilar(p); 22 } 23 printf(” \n”); 24 } 25 26 int main( int argc , char * argv[]) 27 { 28 Lista *L= creaLista () ; 29 Pila *P= creaPila () ; 30 insertar(L, 1); 31 insertar(L, 2); 32 insertar(L, 3); 33 recorrer(L); 34 imprimir lista inversa(L - >inicio); 35 printf(” \n”); 36 imprimir lista inversa pila(L - >inicio , P) ; 37 destruirLista(L); 38 destruirPila(P); 39 return 0; 40 }

description

S1,Estructura de datos

Transcript of S1:Estructura de datos

Page 1: S1:Estructura de datos

Universidad Andres Bello

Facultad de Ingenierıa

Ingenierıa en Computacion e Informatica

Estructura de Datos

Solemne INombre: Nota:

Profesores: Carlos Contreras Bolton – Jose Luis Allende – Felipe Reyes GonzalezAyudantes: Carlos Rey – Daniela Ubilla – Tamara Saez Fecha: 22 de Abril del 2014

Instrucciones:

Coloque su nombre a todas las hojas.

Apague o silencie sus celulares. NO se podra contestar llamadas ni visualizarel celular. Si se realiza una de las acciones anteriores obtendra nota mınima.

Toda copia o intento de copia sera calificada con nota mınima.

Tiene 90 minutos para realizar la prueba.

1 15

2 15

3 15

4 15

5 15

Suma: 75

+10

Nota: 85

Pregunta 1 (15 puntos)

Realizar una funcion que imprima una lista de manera inversa usando recursividad y luego quite larecursividad usando pilas.

1 #include ” l i s t a . h”2 #include ” p i l a . h”34 void imp r im i r l i s t a i n v e r s a (Nodo ∗ i )5 {6 i f ( i != NULL)7 {8 imp r im i r l i s t a i n v e r s a ( i−>s i g u i e n t e ) ;9 p r i n t f ( ” %d ” , i−>datos−>dato1 ) ;

10 }11 }1213 void i m p r im i r l i s t a i n v e r s a p i l a (Nodo ∗ i , P i l a ∗p)14 {15 for ( ; i != NULL; i = i−>s i g u i e n t e )16 ap i l a r (p , i−>datos−>dato1 ) ;1718 while ( ! vac ia (p) )19 {20 p r i n t f ( ” %d ” , tope (p)−>datos−>dato1 ) ;21 de s ap i l a r (p) ;22 }23 p r i n t f ( ”\n” ) ;24 }2526 int main ( int argc , char ∗argv [ ] )27 {28 Li s ta ∗L = cr eaL i s t a ( ) ;29 Pi la ∗P = cr eaP i l a ( ) ;30 i n s e r t a r (L , 1) ;31 i n s e r t a r (L , 2) ;32 i n s e r t a r (L , 3) ;33 r e c o r r e r (L) ;34 imp r im i r l i s t a i n v e r s a (L−> i n i c i o ) ;35 p r i n t f ( ”\n” ) ;36 i m p r im i r l i s t a i n v e r s a p i l a (L−>i n i c i o , P) ;37 d e s t r u i r L i s t a (L) ;38 d e s t r u i rP i l a (P) ;39 return 0 ;40 }

Page 2: S1:Estructura de datos

Estructura de Datos Solemne I

Pregunta 2 (15 puntos)

Realizar una funcion para calcular el numero combinatorio de la ecuacion 1 y calcule su eficiencia. Elfactorial debe ser recursivo. (

n

k

)=

n!

m!(n−m)!, n,m ≥ 0 y n ≥ m (1)

1 #include <s t d i o . h>2 #include <s t d l i b . h>34 long double f a c t o r i a l (unsigned n)5 {6 i f (n == 0 | | n == 1)7 return 1 ;8 else9 return n ∗ f a c t o r i a l (n−1) ;

10 }1112 long double numCombinatorio (unsigned n , unsigned m)13 {14 return f a c t o r i a l (n) / ( f a c t o r i a l (m) ∗ f a c t o r i a l (n − m) ) ;15 }1617 int main ( int argc , char ∗argv [ ] )18 {19 int n = ato i ( argv [ 1 ] ) ;20 int m = ato i ( argv [ 2 ] ) ;21 p r i n t f ( ” %0. l l f \n” , numCombinatorio (n , m) ) ;22 return 0 ;23 }

Estudiamos la eficiencia de la funcion factorial. Su ecuacion de recurrencia es:

T (n) =

1 si n = 0

1 si n = 1

T (n− 1) + 1 si n > 1

Aplicamos expansion:

T (n) = T (n− 1) + 1

= T (n− 2) + 2

= T (n− 3) + 3

...

= T (n− k) + k

... k=n−1

= T (n− (n− 1)) + n− 1

= T (1) + n− 1

= 1 + n− 1 = n

= O(n)

Por tanto, para estudiar la eficiencia de la funcion numCombinatorio basta con observar que haytres llamados de la funcion factorial con tamanos n, m y n−m. Por tanto, la eficiencia de la funcionnumCombinatorio es n + n−m + m = O(n).

Carlos Contreras Bolton – Jose Luis Allende – Felipe Reyes Gonzalez2

Page 3: S1:Estructura de datos

Estructura de Datos Solemne I

Pregunta 3 (15 puntos)

Realizar una funcion que reciba dos listas y esta retorne la diferencia entre las listas, es decir, todoslos elementos de la primera lista que NO estan en la segunda.

1 #include ” l i s t a . h”23 Nodo ∗ l o c a l i z a r ( L i s t a ∗ l i s t a , int dato )4 {5 Nodo ∗ i ;6 for ( i = l i s t a−> i n i c i o ; i != NULL; i = i−>s i g u i e n t e )7 i f ( i−>datos−>dato1 == dato )8 return i ;9 return i ;

10 }1112 Li s ta ∗ d i f e r e n c i a ( L i s t a ∗ l1 , L i s t a ∗ l 2 )13 {14 Nodo ∗aux=l1−> i n i c i o ;15 Nodo ∗tmp ;16 while ( aux−>s i g u i e n t e != NULL)17 {18 /∗ busca s i e l elemento de L1 es t a en L2 ∗/19 tmp = l o c a l i z a r ( l2 , aux−>s i gu i en t e−>datos−>dato1 ) ;20 i f (tmp != NULL)21 aux−>s i g u i e n t e = aux−>s i gu i en t e−>s i g u i e n t e ; /∗ el imina e l nodo de la primera l i s t a ∗/22 else23 aux = aux−>s i g u i e n t e ; /∗ sino pregunta por e l s i g u i e n t e elemento ∗/24 }25 return l 1 ;26 }2728 int main ( int argc , char ∗argv [ ] )29 {30 Li s ta ∗L1 = c r eaL i s t a ( ) ;31 Li s ta ∗L2 = c r eaL i s t a ( ) ;32 i n s e r t a r (L1 , 1) ;33 i n s e r t a r (L1 , 2) ;34 i n s e r t a r (L1 , 3) ;35 i n s e r t a r (L1 , 7) ;36 i n s e r t a r (L1 , 4) ;37 r e c o r r e r (L1) ;38 i n s e r t a r (L2 , 1) ;39 i n s e r t a r (L2 , 2) ;40 i n s e r t a r (L2 , 3) ;41 r e c o r r e r (L2) ;42 Li s ta ∗L3 = d i f e r e n c i a (L1 , L2) ;43 r e c o r r e r (L3) ;44 d e s t r u i r L i s t a (L1) ;45 d e s t r u i r L i s t a (L2) ;46 return 0 ;47 }

Pregunta 4 (15 puntos)

Explique lo que es un puntero. Ademas explique para que sirven las siguientes funciones: malloc(), calloc(),realloc(), free(). Desarrolle un programa que muestre su funcionamiento.

i) puntero: es un tipo de variable la cual almacena una direccion en memoria y proporciona una formade referirse a la direccion de memoria donde esta almacenado un dato.

ii) malloc: Reserva una porcion de memoria de un tamano determinado en bytes. El prototipo de lafuncion es void *malloc(tamano en bytes). La funcion malloc no inicializa el espacio reservadoy retorna un puntero al primer byte de la direccion de memoria reservada si tuvo exito, en casocontrario retorna NULL.

iii) calloc: Reserva n veces una porcion de memoria de un tamano determinado en bytes. El prototipode la funcion es void *calloc(cantidad de veces, tamano en bytes). Inicializa el bloque de memoriareservado y retorna un puntero al primer byte del bloque reservado.

iv) realloc: Cambia el tamano del objeto apuntado por ptr al tamano especificado por tamano. Elprototipo de la funcion es void *realloc(void *ptr, tamano). La funcion realloc retorna o bien unpuntero NULL o bien un puntero posiblemente al espacio adjudicado mudado.

Carlos Contreras Bolton – Jose Luis Allende – Felipe Reyes Gonzalez3

Page 4: S1:Estructura de datos

Estructura de Datos Solemne I

v) free: Libera un bloque de memoria. El prototipo es void free(localizacion). Las llamadas parala liberacion de bloques de memoria reservada previamente pueden realizarse en cualquier orden,independiente del modo o tiempo en que fueron reservados.

vi) Ejemplo de uso:

1 #include <s t d i o . h>2 #include <s t d l i b . h>34 int main ( int argc , char ∗argv [ ] )5 {6 int n = 10 , i ;7 int ∗a ;8 int ∗b ;9 a = malloc (n ∗ s izeof ( int ) ) ;

10 b = c a l l o c (n , s izeof ( int ) ) ;1112 for ( i = 0 ; i < n ; i++)13 a [ i ] = 1 ;1415 for ( i = 0 ; i < n ; i++)16 p r i n t f ( ” %d ” , a [ i ] ) ;17 p r i n t f ( ”\n” ) ;1819 a = r e a l l o c ( a , n∗2) ;2021 for ( i = 0 ; i < n∗2 ; i++)22 p r i n t f ( ” %d ” , a [ i ] ) ;23 p r i n t f ( ”\n” ) ;2425 for ( i = 0 ; i < n ; i++)26 p r i n t f ( ” %d ” , b [ i ] ) ;27 p r i n t f ( ”\n” ) ;2829 f r e e ( a ) ;30 f r e e (b) ;3132 return 0 ;33 }

Carlos Contreras Bolton – Jose Luis Allende – Felipe Reyes Gonzalez4

Page 5: S1:Estructura de datos

Estructura de Datos Solemne I

Pregunta 5 (15 puntos)

La criba de Eratostenes es un algoritmo que permite encontrar los primos menores que n ∈ N. Con-siste en generar una lista con los numero comprendidos entre 2 y n. Se comienza por p, el cual es elprimer numero de la lista. Luego, se marcan todos los multiplos de p en la lista. Finalmente, p se declaraprimo y se procede con el siguiente numero que no este marcado, y ası sucesivamente. El proceso terminacuando el cuadrado del mayor numero confirmado como primo es mayor que n.

Mediante el uso de colas implemente la criba de Eratostenes.

1 #include ” co l a . h”23 bool e r a t o s t en e s ( Cola ∗c )4 {5 Nodo ∗ i ;6 In f o ∗d ;7 int j , n , p , max ;89 n = c−>tamano ;

10 pop ( c ) ; // Se el imina e l 011 pop ( c ) ; // Se el imina e l 11213 while ( ( primero ( c )−>datos−>dato1 ∗ primero ( c )−>datos−>dato1 ) < n )14 {15 p = primero ( c )−>datos−>dato1 ;16 // Se imprime e l primer elemento , siempre es primo .17 p r i n t f ( ” %d\n” , primero ( c )−>datos−>dato1 ) ;18 max = c−>tamano ; // se obt iene e l largo de la cola , para no recorrer l a in f in i tamente .19 for ( j = 0 ; j < max ; j++)20 {21 // Si no es mul t ip lo de p , se debe mantener en la co la .22 i f ( primero ( c )−>datos−>dato1 % p != 0)23 push ( c , primero ( c )−>datos−>dato1 ) ;24 // Se saca e l primer elemento para continuar analizando e l res to de l o s numeros .25 pop ( c ) ;26 }27 }28 while ( c−> i n i c i o != NULL) // Se imprimen e l res to de l o s numeros , que siempre seran primos .29 {30 p r i n t f ( ” %d\n” , primero ( c )−>datos−>dato1 ) ;31 pop ( c ) ;32 }33 p r i n t f ( ”\n” ) ;34 }3536 int main ( int argc , char ∗argv [ ] )37 {38 Cola ∗C;39 int i , n ;40 C = creaCola ( ) ;4142 p r i n t f ( ” Ing r e s e n : ” ) ;43 s can f ( ” %d” , &n) ;44 for ( i = 0 ; i < n ; i++)45 push (C, i ) ; // Se l l e n a la co la con elementos de l 0 a l 204647 e r a t o s t en e s (C) ;4849 de s t ru i rCo l a (C) ;50 return 0 ;51 }

Carlos Contreras Bolton – Jose Luis Allende – Felipe Reyes Gonzalez5