Vous êtes sur la page 1sur 10

Universidad Nacional Autónoma de México

Facultad de Ingeniería

Estructura de Datos y Algoritmos

Profesora: Elba Karen Sáenz García

Práctica 7

Gajardo Rodriguez Daniel Andrés

Velasco Cruz Omar Alí


Objetivos:

Revisar las definiciones, características, procedimientos y ejemplos de las estructuras


lineales Lista simple y Lista circular, con la finalidad de comprender sus estructuras y poder
implementarlas.

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.

A diferencia de un arreglo, el cual también es un conjunto de nodos alineados de manera


lineal, el orden está determinado por una referencia, no por un índice, y el tamaño no es
fijo.

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.

puts("1) Insertar un elemento ");


puts("2) Suprimir un elemento");
puts("3) Buscar un elemento en la lista ");
puts("4) Mostrar todos los Elementos de la lista");
puts("5) Eliminar todos los Elementos de la lista");
puts("6) Salida");

La opción 1, 2 ya están implementadas y agregadas en cada caso. Agregar opción 3,4 y 5


Para la opción 3 se debe implementar una función donde se recorra la lista para buscar una
cadena dada en la lista y de información de la posición donde se haya encontrado.
Tip: Se puede hacer uso de la función strcmp (devuelve 0 si las cadenas de texto son iguales
(incluyendo mayúsculas y minúsculas); si la primera cadena es mayor que la segunda,
devuelve un número positivo; si es mayor la segunda, devuelve un valor negativo.)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct ElementoLista {
int dato;
struct ElementoLista *sig;
};

typedef struct ElementoLista elemento;

struct UbicacionLista {
elemento *inicio;
elemento *fin;
int tam;
};
typedef struct UbicacionLista lista;

void crealista(lista *lista);


int insertarfin(lista *lista, int valor);
int suprimir (lista *lista);
int suprimirtodo(lista *lista);
void buscar(lista *lista,int valor);
void mostrar(lista *lista);

int main (){


lista *x;
if((x=(lista*)malloc(sizeof(lista)))==NULL)
return -1;
crealista(x);
int op,valor;
do{
printf("\n");
puts("1) Insertar un elemento ");
puts("2) Suprimir un elemento");
puts("3) Buscar elemento ");
puts("4) Mostrar todos los Elementos de la lista");
puts("5) Eliminar todos los Elementos de la lista");
puts("6) Salida\n");
printf("Opcion: ");
scanf("%d", &op);
system("cls");

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;
};

typedef struct ElementoLista elemento;

struct UbicacionLista {
elemento *inicio;
elemento *fin;
int tam;
};
typedef struct UbicacionLista lista;
int crearuleta(lista *lista);
void mostrar (lista *lista);

int main (){


int op, m,i,n;
lista *x;
elemento *y;
if((x=(lista*)malloc(sizeof(lista)))==NULL)
return -1;
crearuleta(x);
srand(time(0));
do{
n=rand()%((36*5)+1);
printf("Ingrese valor entre 0 y 36\n\n");
scanf("%d",&m);
printf("\n");
y=x->inicio;
for(i=0;i<n;i++){
y=y->sig;
}
printf("Valor ingresado: %d\nValor ruleta: %d\n\n",m,y->dato);
printf("Ingrese (1) para volver a girar la ruleta\n\n");
scanf("%d",&op);
printf("\n");
}while(op==1);
free(x);
}
int crearuleta(lista *lista){
int i;
lista->inicio=NULL;
lista->fin=NULL;
lista->tam=0;
elemento *aux,*tmp;
if((aux=(elemento*)malloc(sizeof(elemento)))==NULL)
return -1;

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.

Vous aimerez peut-être aussi