Académique Documents
Professionnel Documents
Culture Documents
Facultad de Ingeniería
Práctica 7
Introducción
Las listas son un tipo de estructura de datos lineal y dinámica. Es lineal porque cada
elemento tiene un único predecesor y un único sucesor, y es dinámica porque su tamaño
no es fijo y se puede definir conforme se requiera. Las operaciones básicas dentro de una
lista son BUSCAR, INSERTAR Y ELIMINAR.
Lista simple
Una lista simple (también conocida como lista ligada o lista simplemente ligada) está
constituida por un conjunto de nodos alineados de manera lineal (uno después de otro) y
unidos entre sí por una referencia.
Lista circular
Una lista circular es una lista simplemente ligada modificada, donde el apuntador del
elemento que se encuentra al final de la lista (TAIL) apunta al primer elemento de la lista
(HEAD).
Desarrollo
Actividad. Se proporciona un código fuente para el manejo de las listas, en la función main
() se muestra un menú con las opciones de las funciones que se pueden realizar.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct ElementoLista {
int dato;
struct ElementoLista *sig;
};
struct UbicacionLista {
elemento *inicio;
elemento *fin;
int tam;
};
typedef struct UbicacionLista lista;
switch(op)
{
case 1:
printf ("\nIngrese dato:");
scanf("%d",&valor);
if(insertar(x,valor)==0)
printf("\nInserto\n\n");
else
printf("\nno Inserto\n\n");
system("pause");
system("cls");
break;
case 2:
if(x->tam==0){
printf("\nLista vacia, no se puede eliminar\n\n");
system("pause");
system("cls");
}else{
if(suprimir(x)==0)
printf ("\n\nSuprimido\n\n");
else
printf("\n\nNo suprimido\n\n");
}
system("pause");
system("cls");
break;
case 3:
if(x->tam!=0){
printf("Ingrese valor a buscar\n\n");
scanf("%d",&valor);
printf("\n");
buscar(x,valor);
}else{
printf("Lista vacia, no se puede buscar\n\n");
system("pause");
system("cls");
}
break;
case 4:
if(x->tam==0)
printf("Lista vacia, no se puede mostrar\n\n");
else
mostrar(x);
printf("\n");
system("pause");
system("cls");
break;
case 5:
if(x->tam==0){
printf("\nLista vacia, no se puede eliminar\n\n");
system("pause");
system("cls");
}
else{
suprimirtodo(x);
}
break;
case 6:
if(x->tam==0)
free(x);
else{
suprimirtodo(x);
free(x);
}
break;
}
}while(op!=6);
}
void crealista(lista *lis){
lis->tam=0;
lis->inicio=NULL;
lis->fin=NULL;
}
int insertar(lista *lista, int valor){
int opp,n,i;
elemento *aux,*actual;
if((aux=(elemento*)malloc(sizeof(elemento)))==NULL)
return -1;
aux->dato=valor;
if(lista->inicio==NULL&&lista->fin==NULL&&lista->tam==0){
aux->sig=NULL;
lista->inicio=aux;
lista->fin=aux;
lista->tam++;
return 0;
}else{
printf("\n");
puts("1) Inicio ");
puts("2) Final");
puts("3) Despues de una posicion \n");
scanf("%d",&opp);
if(opp==1){
aux->sig=lista->inicio;
lista->inicio=aux;
}
if(opp==2){
lista->fin->sig=aux;
lista->fin=aux;
aux->sig==NULL;
}
if(opp==3){
do{
printf("\nIngrese la posicion donde se quiere insertar; se insertara despues del numero dado:\n\n");
scanf("%d",&n);
}while(n<1||n>lista->tam);
actual=lista->inicio;
for(i=1;i<n;i++)
actual=actual->sig;
if(actual->sig==NULL)
return -1;
aux->sig=actual->sig;
actual->sig=aux;
}
}
lista->tam++;
return 0;
}
int suprimir(lista *lista){
int opp,i,n;
elemento *aux, *tmp;
printf("\n");
puts("1) Inicio ");
puts("2) Final");
puts("3) Despues de una posicion \n");
scanf("%d",&opp);
if(opp==1){
if(lista->tam==1){
aux=lista->inicio;
lista->inicio=NULL;
lista->fin=NULL;
free(aux);
}else{
aux=lista->inicio;
lista->inicio=aux->sig;
free(aux);
}
}
if(opp==2){
if(lista->tam==1){
aux=lista->inicio;
lista->inicio=NULL;
lista->fin=NULL;
free(aux);
}else{
aux=lista->inicio;
for(i=1;i<lista->tam-1;i++)
aux=aux->sig;
lista->fin=aux;
free(aux->sig);
aux->sig=NULL;
}
}
if(opp==3){
do{
printf("\nIngrese la posicion donde se quiere insertar; se insertara despues del numero dado:\n\n");
scanf("%d",&n);
}while(n<1||n>lista->tam);
aux=lista->inicio;
for(i=1;i<n;i++)
aux=aux->sig;
if(aux->sig==NULL)
return -1;
tmp=aux->sig;
aux->sig=tmp->sig;
free(tmp);
}
lista->tam--;
return 0;
}
void buscar(lista *lista,int valor){
int i;
elemento *aux;
aux=lista->inicio;
if(aux->dato==valor)
printf("El valor: %d, se encuentra en la posicion: 1\n",valor);
printf("\n");
for(i=1;i<lista->tam;i++){
aux=aux->sig;
if(aux->dato==valor)
printf("El valor: %d, se encuentra en la posicion: %d\n",valor,i+1);
printf("\n");
}
system("pause");
system("cls");
}
void mostrar(lista *lista){
int i;
elemento *aux;
aux=lista->inicio;
printf("%d\n",aux->dato);
for(i=1;i<lista->tam;i++){
aux=aux->sig;
printf("%d\n",aux->dato);
}
}
int suprimirtodo(lista *lista){
int i;
elemento *aux;
aux=lista->inicio;
if(lista->tam==1){
lista->inicio==NULL;
lista->fin==NULL;
lista->tam--;
free(aux);
}else{
do{
aux=aux->sig;
free(lista->inicio);
lista->inicio=aux;
lista->tam--;
}while(lista->inicio!=lista->fin);
free(aux);
lista->inicio=NULL;
lista->fin=NULL;
lista->tam--;
}
printf("\nLista suprimida\n\n");
system ("pause");
system("cls");
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct ElementoLista {
int dato;
struct ElementoLista *sig;
};
struct UbicacionLista {
elemento *inicio;
elemento *fin;
int tam;
};
typedef struct UbicacionLista lista;
int crearuleta(lista *lista);
void mostrar (lista *lista);
aux->dato=0;
lista->inicio=aux;
lista->fin=aux;
lista->fin->sig=lista->inicio;
lista->tam++;
for(i=1;i<=36;i++){
tmp=NULL;
if((tmp=(elemento*)malloc(sizeof(elemento)))==NULL)
return -1;
tmp->dato=i;
lista->fin=tmp;
aux->sig=tmp;
lista->fin->sig=lista->inicio;
aux=tmp;
}
return 0;
}
Conclusiones:
Daniel Gajardo
La práctica estuvo muy interesante ya que pudimos reforzar el uso de estructuras de datos
como lista simplemente enlazada y lista doblemente enlazada, temas que se me hicieron
un poco difícil al principio, pero que ya voy entendiendo mejor.
Omar Alí
Con la práctica se logró una mejor comprensión de los procesos de añadir, suprimir, buscar
y mostrar los elementos de una lista, en la creación de enlaces entre los elementos que la
constituyen. Poco a poco el tema se va entendiendo mejor.