Sei sulla pagina 1di 3

CIENCIA DE LA COMPUTACION II

PRIMERA PRCTICA CALIFICADA.


En los siguientes ejercicios, trabajaremos con una lista enlazada para
almacenar nmeros de punto flotante (double). Los nodos de la lista son
compatibles con la siguiente declaracin de tipo:
struct nodo {
double x; // nmero a almacenar
struct nodo * p; // direccin del siguiente elemento en la lista
};
1. Implementar la insercin al inicio de la lista:
(a) Escribir una funcin
(3 puntos)
struct nodo * crear_nodo(double y);
que cree un nuevo nodo, inicialice el campo x con el valor del parmetro y,
inicialice el campo p con NULL y retorne la direccin del nodo.
(b) Escribir una funcin (3 puntos)
struct nodo * push_front(struct nodo* L, double y);
que reciba la direccin actual de inicio L de la lista (o NULL si la lista est
vaca), ejecute una llamada a crear nodo para crear un nuevo nodo y
almacenar en ste el valor de y, y finalmente inserte el nodo en la lista.
La funcin debe retornar la nueva direccin de inicio de la lista.
2. Implementar una funcin para calcular el tamao de una lista:
int size(struct nodo * L); (4 puntos)
size recibe como parmetro la direccin de inicio L de la lista (o NULL si la
lista est vaca) y debe retornar un valor entero igual a la cantidad de nodos
que la lista contiene. Si la lista est vaca, size debe retornar cero.
3. Examinar el siguiente fragmento de cdigo. Suponer que push front es la
funcin de insercin al inicio definida en el primer ejercicio.
(a) Que tarea realiza la funcin f1? Explicar la respuesta. (2 puntos)
(b) Cual es la salida del programa cuando el usuario ingresa 1 2 3 0 para
la primera lista y -1.5 4.7 0 para la segunda lista? (2 puntos)
(c) qu ocurre cuando una de las listas ingresadas est vaca? Si ambas
estn vacas? (2 puntos)

struct nodo* f1(struct nodo* L1, struct nodo* L2)


{
if(L1==NULL) return L2;
struct nodo * aux;
aux= L1;
while((aux->p)!=NULL)
aux= aux->p;
aux->p= L2;
return L1;
}
int main(void)
{
struct nodo * L1, * L2;
L1= NULL; L2= NULL;
double x;
cout << "Ingrese la primera lista, 0 para terminar" << endl;
do {
cin >> x;
if(x!=0) L1=push_front(L1,x);
} while(x!=0);
cout << "Ingrese la segunda lista, 0 para terminar" << endl;
do {
cin >> x;
if(x!=0) L2=push_front(L2,x);
} while(x!=0);
L1=f1(L1, L2);
cout << "Nueva lista" << endl;
struct nodo* aux;
aux= L1;
while(aux!=NULL) {
cout << aux->x << "\t";
aux= aux->p;
}
return EXIT_SUCCESS;
}
4.- Crear el programa parcial-practica.cpp que contenga algunas funciones
bsicas para trabajar con vectores dispersos de tipo double. Estos vectores
se representan mediante listas enlazadas donde a cada componente no nula
ai del vector le corresponde un nodo de la lista cuyo tipo ha sido definido de
la siguiente manera:
struct nodo
{
int i;

double a;
struct nodo * p;
};
El campo i almacena el ndice de la componente dentro del vector (la
primera componente tiene ndice cero) y el campo a almacena su valor.
Como es usual, el campo p contiene la direccin del siguiente nodo de la
lista, o NULL para el caso del nodo final.
La funcin crear nodo sirve para crear un nuevo nodo e inicializarlo con
valores de i y de a que recibe como parmetros. La funcin push back se
encarga de crear nuevos nodos e insertarlos al final de la lista. La funcin
lectura puede usarse para leer k nuevas componentes desde un flujo de
datos de entrada e insertarlas al final de la lista; la funcin escritura imprime
el contenido de la lista en un flujo de datos de salida.
Tanto para la lectura como para la escritura se emplea el siguiente formato:
cada componente no nula est representada (de preferencia en una lnea
independiente) por un par de nmeros que indican su ndice i y su valor a.
Las componentes estn ordenadas ascendentemente por sus ndices. Por
ejemplo, el vector de dimensin
10:
x = (0, 0, 3.3, 0, 0,2.7, 0, 0, 0, 1.1)
se representa como:
2 3.3
5 -2.7
9 1.1

Potrebbero piacerti anche