Examen de listas enlazadas
Programación, Informática, clases, C\C++ 16 May, 2006Como viene siendo habitual, aquí dejo mi examen de listas enlazadas espero que sea de ayuda.
Descargar | Código Fuente Del Examen
Los apartados que se pedían en el examen eran:
Crear la lista películas
Consiste en crear una lista enlazada dando de alta las películas del videoclub. Esta lista está ordenada por cod.
Actualizar la lista enlazada películas con la información de la tabla tdía.
Este proceso guarda en una tabla con las operaciones que se van a realizar en la lista, es decir las actualizaciones que se van a realizar y pueden ser:
Película NUEVA, valor del campo operación: Está operación significa dar de alta la película en la lista enlazada, en el lugar correspondiente, es decir, manteniendo el orden. Si ya existe la película visualizar los mensajes de error oportunos
Película DEVUELTA, valor del campo operación 2. Esta operación consiste en incrementar el campo existencias. Sacar mensajes de error oportunos.
Película BAJA, valor del campo operación 3. Esta operación consiste en borrar la película de la lista enlazada. Sacar los mensajes oportunos en caso de error.
Visualizar lista.
-
#include <stdio .h>
-
#include <stdlib .h>
-
#include <string .h>
-
#include <conio .h>
-
#define MAX 25
-
#define NUEVA 1
-
#define DEVUELTA 2
-
#define BAJA 3
-
struct tdia
-
{
-
char codigo[20];
-
int operacion;
-
};
-
typedef struct tpeliculas
-
{
-
char cod[20];
-
int existencias;
-
struct tpeliculas *sig;
-
}nodo;
-
-
int menu();
-
nodo * nuevo_nodo();
-
void cargar_lista(nodo ** inicio);
-
char cargar_tabla(struct tdia *tabla);
-
void actualizar_lista(struct tdia tabla[MAX], nodo **inicio, int total);
-
void ver_lista(nodo * inicio);
-
void borrar_lista(nodo ** inicio);
-
-
void main()
-
{
-
struct tdia tabla[MAX];
-
nodo *inicio=NULL;
-
int opcion, i;
-
char resp='s';
-
do{
-
opcion=menu();
-
switch(opcion)
-
{
-
case 1:
-
clrscr();
-
cargar_lista(&inicio);
-
break;
-
case 2:
-
clrscr();
-
resp='s';
-
for(i=0; i<max && resp!='n'; i++)
-
{
-
resp=cargar_tabla(&tabla[i]);
-
}
-
break;
-
case 3:
-
clrscr();
-
actualizar_lista(tabla, &inicio, i);
-
getche();
-
break;
-
case 4:
-
clrscr();
-
ver_lista(inicio);
-
getche();
-
break;
-
case 5:
-
clrscr();
-
opcion=7;
-
borrar_lista(&inicio);
-
break;
-
default:
-
menu();
-
}
-
}while(opcion!=7);
-
}
-
-
nodo * nuevo_nodo()
-
{
-
//reservamos memoria para un elemento de la lista
-
nodo *p;
-
p=(nodo *)malloc(sizeof(nodo));
-
if (!p)
-
{
-
perror("Insuficiente memoria");
-
exit(1);
-
}
-
//la direccion del siguiente elemento la iniciamos aqui a NULL
-
//hasta que coja un valor.
-
p->sig=NULL;
-
return(p);
-
}
-
-
void cargar_lista(nodo ** inicio)
-
{
-
char resp, codigo[20];
-
int existencias;
-
nodo *actual, *anterior, *nuevo_elem;
-
do
-
{
-
gets(codigo); fflush(stdin);
-
scanf("%d", &existencias); fflush(stdin);
-
anterior=actual=*inicio;
-
while(actual!=NULL && strcmp(actual->cod,codigo)>0)
-
{
-
//busca posicion para nuevo elemento
-
anterior=actual;
-
actual=actual->sig;
-
}
-
//asignamos memoria para un nuevo nodo
-
nuevo_elem=nuevo_nodo();
-
strcpy(nuevo_elem->cod, codigo);
-
nuevo_elem->existencias=existencias;
-
//enlazamos el elemento en la lista entre el elemento anterior y el del
-
//recorrido del while actual
-
if(anterior==NULL || anterior == actual)
-
{
-
//Para insertar en el incio de la lista
-
nuevo_elem->sig=anterior;
-
*inicio=nuevo_elem;//tenemos que actualizar el comienzo de la lista
-
}
-
else
-
{
-
//en el caso de elementos intermedios y el final
-
nuevo_elem->sig=actual;
-
anterior->sig=nuevo_elem;
-
}
-
scanf("%c", &resp); fflush(stdin);
-
}while(resp!='n');
-
}
-
-
char cargar_tabla(struct tdia *tabla)
-
{
-
char resp;
-
gets(tabla->codigo); fflush(stdin);
-
scanf("%d", &(tabla->operacion)); fflush(stdin); -
-
scanf("%c", &resp); fflush(stdin);
-
return(resp);
-
}
-
-
void actualizar_lista(struct tdia tabla[MAX], nodo **inicio, int total)
-
{
-
nodo *p,*ante, *nuevo_elem;
-
ante=p=*inicio;
-
-
int j, existencias, sw=0, error=0;
-
char codigo[20];
-
ver_lista(*inicio);
-
for(j=0;j<total ;j++)
-
{
-
error=0;
-
if(tabla[j].operacion==NUEVA)
-
{
-
p=*inicio;
-
while(p!=NULL)
-
{
-
if (strcmp(p->cod, tabla[j].codigo)==0)
-
{
-
error=1;//quiere decir que existe el codigo y mostraremos un
-
//mensaje de error
-
}
-
p=p->sig;
-
}
-
if(error==0)
-
{
-
//se va a introducir el elemento respetando el orden
-
ante=p=*inicio;
-
while(p!=NULL && strcmp(p->cod, tabla[j].codigo)>0)
-
{
-
//busca posicion para nuevo elemento
-
ante=p;
-
p=p->sig;
-
}
-
nuevo_elem=nuevo_nodo();
-
strcpy(nuevo_elem->cod, tabla[j].codigo);
-
nuevo_elem->existencias=10;
-
//enlazamos el elemento en la lista
-
if(ante==NULL || ante==p)
-
{
-
//inserta al principio al inicio
-
nuevo_elem->sig=ante;
-
*inicio=nuevo_elem;
-
}
-
else
-
{
-
//caso de elementos intermedios y final
-
nuevo_elem->sig=p;
-
ante->sig=nuevo_elem;
-
}
-
}
-
else
-
}
-
error=0;
-
if(tabla[j].operacion==DEVUELTA)
-
{
-
p=*inicio;
-
while(p!=NULL)
-
{
-
if (strcmp(p->cod, tabla[j].codigo)==0)
-
{
-
error=1;//quiere decir que existe el codigo y mostraremos un
-
//mensaje de error
-
}
-
p=p->sig;
-
}
-
if(error==1)
-
{
-
p=*inicio;
-
while(p!=NULL)
-
{
-
//devolvemos una peli
-
if(strcmp(p->cod, tabla[j].codigo)==0)
-
p->existencias+=1;
-
p=p->sig;
-
}
-
}
-
else
-
}
-
error=0;
-
if(tabla[j].operacion==BAJA)
-
{
-
p=*inicio;
-
while(p!=NULL)
-
{
-
if (strcmp(p->cod, tabla[j].codigo)==0)
-
{
-
error=1;//quiere decir que existe el codigo y mostraremos un
-
//mensaje de error
-
}
-
p=p->sig;
-
}
-
if(error==1)
-
{
-
ante=p=*inicio;
-
while(p!=NULL)
-
{
-
//borrar un registro pelicula entero
-
if(strcmp(p->cod, tabla[j].codigo)==0)
-
{
-
if(ante==p)
-
{
-
*inicio=p->sig;
-
free(p);
-
}
-
else if(p->sig!=NULL)
-
{
-
p=ante->sig;
-
ante->sig=p->sig;
-
free(p);
-
}
-
}
-
else
-
{
-
ante->sig=NULL;
-
free(p);
-
}
-
}
-
ante=p;
-
p=p->sig;
-
}
-
else
-
}
-
}
-
-
-
-
}
-
-
void ver_lista(nodo * inicio)
-
{
-
int i;
-
nodo *p;
-
p=inicio;
-
gotoxy(1,1);
-
gotoxy(25,1);
-
for(i=1; i<35; i++)
-
{
-
gotoxy(i,2);
-
}
-
i=3;
-
while(p!=NULL)
-
{
-
gotoxy(1,i);
-
gotoxy(25,i);
-
p=p->sig;
-
i++;
-
}
-
}
-
-
void borrar_lista(nodo ** inicio)
-
{
-
nodo *p;
-
p=*inicio;
-
while(p!=NULL)
-
{
-
*inicio=p->sig;
-
free(p);
-
p=*inicio;
-
}
-
-
}
-
-
-
int menu()
-
{
-
int resp;
-
do{
-
clrscr();
-
scanf("%d",&resp); fflush(stdin);
-
}while(resp!=1 && resp!=2 && resp!=3 && resp!=4 && resp!=5);
-
return(resp);
-
}
24-August,2006 a las 3:42 pm
Ola amigo como estas? disculpe que te moleste, es que yo estoy siguiendo la carrera de Ingenieria en Informatica y ahora estoy dando la clase de estructura de datos 2 y las clase son con listas enlazadas, circulares, doblementes enlazadas, pilas, colas, grafos, arboles..y necesito que me ayudes si tienes algunas informaciones acerca de esas estructura..yo estoy buscando en internet..pero no encuentro..solo con clase..ose orientado a objeto y eso a mi no me interesa…te agradeceria muchisimo si me ayudaras..gracias por todo..espero tu respuesta en mi direccion de correo…
24-August,2006 a las 9:11 pm
Hola Aldo, si tienes ya una base en C/C++ te recomiendo que te subscribas a alguna lista de correo sobre C, se aprende mucho en ellas y suelen ser buenos colaboradores. Te puedo recomendar la lista Cconclase (http://www.conclase.net/). Tambi?n puedes darte una pasada por el http://www.elrincondelc.com donde encontraras un buen manual de C/C++, adem?s de poder buscar ayuda en sus foros. Ser?a tambi?n recomendable que tuvieras un libro, yo te aconsejo los de Javier Ceballos de la editorial Ra-ma.
Eso es todo lo que suelo yo utilizar a modo de consulta, espero que te sea ?til, un saludo.
Yon? Rocha
8-May,2008 a las 11:34 pm
vos buena onda con este tu codigo, ya que nos sirvio de mucho a todo el grupo, gracias hasta luego
9-May,2008 a las 9:55 am
Me llena de orgullo y satisfación que te haya sido útil.
Un saludo del Rey de aquí
jeje