Sie sind auf Seite 1von 9

Carátula para entrega de prácticas

Facultad de Ingeniería Laboratorio de docencia

Laboratorios de computación
salas A y B
Profesor: Ing. Jonathan Roberto Torres Castillo

Asignatura: Estructura De Datos Y Algoritmos I

Grupo: 9

No de Práctica(s): 8

Integrante(s): VALDERRABANO VEGA ABRAHAM

Semestre: 2018-II

Fecha de entrega: 12/04/2018

Observaciones:

CALIFICACIÓN: _________

1
PRACTICA 8
LISTA DOBLEMENTE LIGADA Y LISTA DOBLEMENTE
LIGADA CIRCULAR
ESTRUCTURA DE DATOS Y ALGORITMOS I
UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO

Profesor: Ing. Jonathan Roberto Torres Castillo

1. Reglas de las Prácticas de Laboratorio


 Deberá respetar la estructura general del documento proporcionado para la respectiva
práctica y llenar cada una de las secciones que aparecen en él.
 El desarrollo de la práctica deberá ser autentico. Aquellos alumnos que presenten los
mismos cálculos, código fuente, etcétera, se les será anulada inapelablemente la
práctica correspondiente con una calificación de 0.
 Deberá subir el informe y los scripts al sistema Schoology. Los archivos deberán tener
las características descritas en el archivo “Reglas_Laboratorio.pdf” de lo contrario su
calificación será de 0.
 El día de entrega establecido deberá ser respetado por todos los alumnos, la práctica
debe ser terminada parcialmente al finalizar la clase y completada máximo a los 7 días
siguientes a la sesión de laboratorio tiempo en el cual debe subir la práctica al ítem
correspondiente a la practica en el sistema Schoology.
 No se tendrán en cuenta informes ni actividades si no asiste a la sesión de laboratorio
y no presenta justificación médica, por lo cual no tendrá derecho a la calificación de
dicha práctica y la nota será de 0.
 La inasistencia a 3 sesiones de laboratorio en el semestre será causal de reprobación
de las prácticas y del curso.

2. Objetivos
Revisarás las definiciones, características, procedimientos y ejemplos de las estructuras lineales Lista
doblemente ligada y Lista doblemente ligada circular, con la finalidad de que comprendas sus
estructuras y puedas implementarlas.

3. 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.

2
Lista doblemente ligada
Una lista doblemente ligada (o lista doble) está constituida por un conjunto de nodos
alineados de manera lineal (uno después de otro) y unidos entre sí por dos referencias,
una al sucesor (NEXT) y una al predecesor (PREV).
La unidad básica de una lista doble es el elemento o nodo. Cada elemento de la lista es un
objeto que contiene la información que se desea almacenar, así como dos referencias, una
al siguiente elemento (NEXT) y otra al elemento anterior (PREV).

Licencia GPL de GNU


El software presente en esta guía práctica es libre bajo la licencia GPL de
GNU, es decir, se puede modificar y distribuir mientras se mantenga la
licencia GPL. /*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see
<http://www.gnu.org/licenses/>.
*
* Author: Jorge A. Solano
*/

4. Planteamiento del Problema y Desarrollo


A continuación se describen las actividades a realizar para la presente práctica, en cada
apartado debe colocar la descripción, los análisis numéricos y/o los resultados de cada
actividad. El código fuente del programa que permitió solucionar cada actividad debe
colocarse en la sección 5.

4.1. Actividad 1

Complete el código y las funciones insertar, eliminar y buscar

3
4
5
4.2. Actividad 2

Realice un menú de usuario e implemente funciones y cambios en el código de la actividad


1 para que el usuario pueda crear una lista, establecer el número máximo de nodos y
determinar si la lista va a agregar nuevos nodos ordenándolos de forma ascendente o
descendente, de igual forma en el menú deben estar las demás funciones que contiene el
código.

En este apartado describa lo realizado y muestre ejemplos con los resultados obtenidos.

5. Código
En esta sección se presenta el código fuente del programa que permitió cumplir los
objetivos propuestos. El programa debe estar comentado en cada una de sus líneas de código
y/o en sus ciclos iterativos.

5.1. Código Actividad 1

#include <stdlib.h>
#include <stdio.h>
typedef struct _nodo
{

6
int valor;
struct _nodo *siguiente;
struct _nodo *anterior;
}
tipoNodo;
typedef tipoNodo *pNodo;
typedef tipoNodo *Lista;

// Funciones con listas:


void Insertar(Lista *l, int v);
void eliminar(Lista *l, int v);

void Buscar (Lista l,int v);


int main(){
Lista lista = NULL;
pNodo p,indice,inicio;
Insertar(&lista, 20);
inicio=lista;
Insertar(&lista, 40);
Insertar(&lista, 30);
Insertar(&lista, 20);

int i=1;
indice=inicio;
while(indice){
printf("\n\t elemento %d = %d\n",i,indice->valor);
i++;
indice=indice->siguiente;
}
system("PAUSE");
return 0;
}

void Insertar(Lista *lista, int v)


{
pNodo nuevo;

nuevo = (pNodo)malloc(sizeof(tipoNodo));
nuevo->valor = v;

if(*lista == NULL){
nuevo->siguiente=NULL;
nuevo->anterior=NULL;
*lista = nuevo;
}

7
else {
nuevo->siguiente = (*lista)->siguiente;
nuevo->anterior=*lista;
(*lista)->siguiente = nuevo;
*lista=nuevo;
if(nuevo->siguiente != NULL){
nuevo->siguiente->anterior=nuevo;
}
}

void eliminar(Lista *lista){


pNodo nodo = NULL;
if(*lista)
{
nodo = (*lista)->siguiente;
if(nodo)
{
//Quitamos atadura al nodo anterior al que vamos a eliminar
(*lista)->siguiente = nodo->siguiente;
if(nodo->siguiente)
{
//Quitamos atadura al nodo siguiente al que queremos eliminar
nodo->siguiente->anterior = *lista;
}
printf("%d fue eliminado",nodo->valor);
free(nodo); //borramos nodo
}
else
printf("El nodo que intentas borrar no existe\n");
}
}

pNodo buscar(Lista nodo, int v){


if(nodo && nodo->valor!=v)
{
while( nodo->valor!=v && nodo->siguiente )
nodo = nodo->anterior;
printf("Ahora tenemos guardada la direccion del nodo %d\n",nodo->valor);
}
printf("El elemento no está de donde me dijiste que buscara en adelante\n");

8
return nodo;

6. Conclusiones
En esta práctica lo más difícil fue colocar las funciones y también al usarlas generaba unos
errores debido al acomodamiento de datos, además se tenia que buscar la manera de
acomodar los datos para poder usar bien las funciones, así como también utilizar los
apuntadores y los parámetros por referencia de las funciones.

7. Referencias
[1] GARCÍA CANO, Edgar, SOLANO GÁLVEZ, Jorge, Guía práctica de estudio #7
LISTA DOBLEMENTE LIGADA Y LISTA DOBLEMENTE LIGADA
CIRCULAR, Facultad de ingeniería, UNAM.

[2] CORMEN, Thomas, LEISERSON, Charles, et al. Introduction to Algorithms 3rd


edition MA, USA The MIT Press, 2009

Das könnte Ihnen auch gefallen