0% encontró este documento útil (0 votos)
35 vistas9 páginas

Práctica de Estructuras de Datos: Listas

El documento detalla la entrega de la práctica #7 sobre estructuras de datos lineales, específicamente listas simples y circulares, en la asignatura de Estructura de Datos y Algoritmos. Se incluyen objetivos, actividades, instrucciones para implementar las estructuras en código, y ejemplos de código para ambas listas. Además, se presentan conclusiones sobre el manejo de apuntadores y las ventajas de estas estructuras en comparación con otras.

Cargado por

eve melquades
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
35 vistas9 páginas

Práctica de Estructuras de Datos: Listas

El documento detalla la entrega de la práctica #7 sobre estructuras de datos lineales, específicamente listas simples y circulares, en la asignatura de Estructura de Datos y Algoritmos. Se incluyen objetivos, actividades, instrucciones para implementar las estructuras en código, y ejemplos de código para ambas listas. Además, se presentan conclusiones sobre el manejo de apuntadores y las ventajas de estas estructuras en comparación con otras.

Cargado por

eve melquades
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

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.

También podría gustarte