Carátula para entrega de prácticas
Facultad de Ingeniería Laboratorio de docencia
Laboratorios de computación
salas A y B
Profesor: JORGE ALBERTO SOLANO GALVEZ
Asignatura: Estructura de datos y algoritmos
Grupo: 10
No de Práctica(s): #7 “Estructuras de datos lineales: Lista simple y
lista circular.”
Integrante(s): Gomez Varela Daniel Imanol, Flores Melquiades
Evelyn Jasmin
No. de Equipo de
cómputo empleado:
No. de Lista o Brigada:
Semestre: 2022-2
Fecha de entrega: 23/03/2022
Observaciones:
CALIFICACIÓN:
Objetivo:
Revisar las definiciones, características, procedimientos y ejemplos de las
estructuras lineales Lista simple y Lista circular, con la finalidad de que
comprendas sus estructuras y puedas implementarlas.
Actividades:
➢ Revisar definición y características de la estructura de datos lista simple.
➢ Revisar definición y características de la estructura de datos lista circular.
➢ Implementar las estructuras de datos lista simple y lista circular.
Instrucciones:
Crear una aplicación tipo estructura de datos LISTA SIMPLE que permita agregar,
buscar y eliminar nodos.
Crear una aplicación tipo estructura de datos LISTA CIRCULAR que permita
agregar, buscar y eliminar nodos.
Ambas aplicaciones deben seguir las siguientes especificaciones
➔ La función principal (main) sólo debe tener una llamada a la función menú.
➔ La función menú debe tener las operaciones de cada estructura de datos, así
como la opción mostrar.
➔ Las estructuras de datos deben manejar información en forma de nodos (con
struct).
Cada nodo debe tener una variable numérica, una cadena de caracteres y las
referencias necesarias (apuntadores de tipo struct nodo).
➔ Todas las operaciones, incluyendo el menú, se deben programar en funciones
distintas y en archivos distintos.
➔ Las estructuras de datos deben estar programadas con memoria dinámica.
Lista simple
//###LISTA SIMPLE###
//-----------main.c-----------
#include <stdio.h>
#include <stdlib.h>
#define MAX 11
enum boolean{ true, false};
struct node {
int num;
char nom[MAX];
struct node *next;
};
#include "insert.c"
#include "delete.c"
#include "show.c"
#include "menu.c"
int main(){
menu();
return 0;
}
//###LISTA SIMPLE###
//----------menu.c------------
void menu (){
struct node *head = NULL;
int op;
while (1){
show(head);
printf ("\nQue deseas hacer?\n");
printf ("1) Agregar\n");
printf ("2) Eliminar\n");
printf ("3) Salir\n");
scanf ("%d", &op);
switch (op)
{
case 1:
insert (&head);
break;
case 2:
delete (&head);
break;
case 3:
return;
default:
printf ("Opcion Invalida");
}
}
}
//------insert.c------
enum boolean insert(struct node **h)
{
struct node *new = (struct node *)malloc (sizeof(struct node ));
if (new !=NULL){
printf ("Ingresa el numero que desees agregar\n");
scanf ("%d", &new->num);
printf("Con que nombre?");
scanf("%s",new->nom);
new->next=NULL;
if (*h != NULL)
{
new ->next=*h;
}
*h=new;
return true;
}
else
{
return false;
}
}
//------delete.c------
struct node *delete(struct node **h)
{
if (*h !=NULL){
int op;
printf ("Que deseas eliminar?");
scanf("%d", &op);
struct node *tmp = (*h);
struct node *prev = NULL;
while (tmp != NULL){
if (tmp->num == op){
if (prev==NULL){
*h = tmp ->next;
} else{
prev->next=tmp->next;
}
tmp->next =NULL;
return tmp;
}
prev =tmp;
tmp=tmp->next;
}
}
printf ("\nADVERTENCIA No se ha podido completar la operacion por las
siguiente posibles razones:");
printf ("\n1) La lista se encuentra vacia\n2) Dicho elemento aun no ha
sido agregado\n3) El elemento ya ha sido eliminado\n");
printf ("\nIntente nuevamente");
return *h;
}
//------show.c------
void show(struct node *head)
{
struct node *tmp= head;
printf ("\n\tSHOW STACK\n\n");
while(tmp != NULL)
{
printf ("%p)\t%s:\t%d->%p\n",tmp,tmp->nom, tmp->num, tmp->next);
tmp = tmp ->next;
}
}
Lista circular
//###LISTA CIRCULAR###
//---------main.c-------------
#include <stdio.h>
#include <stdlib.h>
#define MAX 11
int cont;
enum boolean{ true, false};
struct node {
int num;
char nom[MAX];
struct node *next;
struct node *prev;
};
int cont = 0;
#include "insertar.c"
#include "delete.c"
#include "show.c"
#include "menu.c"
int main(){
menu();
return 0;
}
//###LISTA CIRCULAR###
//---------menu.c-------------
void menu (){
struct node *head = NULL;
struct node *tail = NULL;
int op;
while (1){
show(head);
printf ("\nQue deseas hacer?\n");
printf ("1) Agregar\n");
printf ("2) Eliminar\n");
printf ("3) Salir\n");
scanf ("%d", &op);
switch (op)
{
case 1:
insertar (&head,&tail);
break;
case 2:
delete (&head);
break;
case 3:
return;
default:
printf ("Opcion Invalida");
}
}
}
//------insertar.c------
enum boolean insertar(struct node **h,struct node **t)
{
struct node *new = (struct node *)malloc (sizeof(struct node ));
if (new !=NULL){
printf ("Ingresa el numero que desees agregar\n");
scanf ("%d", &new->num);
printf("Con que nombre?");
scanf("%s",new->nom);
new->next=NULL;
if (*h != NULL)
{
(*t)->next=new;
}else{
(*h)=new;
}
(*t)=new;
new->next=(*h);
cont++;
return true;
}
else
{
return false;
}
}
//------delete.c------
struct node *delete(struct node **h)
{
if (*h !=NULL){
int op;
printf ("Que deseas eliminar?");
scanf("%d", &op);
struct node *tmp = (*h);
struct node *prev = NULL;
while (tmp != NULL){
if (tmp->num == op){
if (prev==NULL){
*h = tmp ->next;
} else{
prev->next=tmp->next;
}
tmp->next =NULL;
return tmp;
}
prev =tmp;
tmp=tmp->next;
}
}
printf ("\nADVERTENCIA No se ha podido completar la operacion por las
siguiente posibles razones:");
printf ("\n1) Aun no has agregado algun elemento\n2) Dicho elemento aun
no ha sido agregado\n3) El elemento ya ha sido eliminado\n");
printf ("\nIntente nuevamente");
return *h;
}
//------show.c------
void show(struct node *head){
struct node *tmp= head;
printf ("\n\tSHOW STACK\n\n");
while(tmp != NULL)
{
printf ("%p):\t%s\t%d->%p\n",tmp,tmp->nom, tmp->num, tmp->next);
tmp = tmp ->next;
}
}
Conclusiones
Para la realización de esta práctica nos quedó más claro el buen manejo de los
apuntadores, al ser parecido a las estructuras de datos lineales anteriores es decir
el de cola y pila, podemos basarnos en ellos para la lógica de las listas. Aprendimos
de las ventajas que estas nos pueden brindar a diferencia de las ya mencionadas,
dado que estas al ser “infinitas” o bien hasta donde la memoria permite, estas nos
posibilitan manejar una gran cantidad de datos sin tener que preocuparse el que
se llenen en un corto periodo de tiempo; no obstante en ellas fue necesario validar
más datos además de hacer uso de una búsqueda con while; en especial para
eliminar los elementos ya que ahora no solo nos permitía quitar desde head o tail
si no que podíamos seleccionar el elemento que queramos, siempre y cuando este
exista en los ya listados.