• No se han encontrado resultados

Listas Circulares

N/A
N/A
Protected

Academic year: 2021

Share "Listas Circulares"

Copied!
27
0
0

Texto completo

(1)

Instituto Politécnico Nacional

Instituto Politécnico Nacional

Escuela Superior de Ingeniería Mecánica y Eléctrica

Escuela Superior de Ingeniería Mecánica y Eléctrica

Unidad Zacatenco

Unidad Zacatenco

“Estructura y Base de

“Estructura y Base de

Datos”

Datos”

Profra.: Lic. Cortes Hernández

Profra.: Lic. Cortes Hernández Lilia

Lilia

“LISTAS CIRCULARES”

“LISTAS CIRCULARES”

Grupo 3C4V

Grupo 3C4V

 PRESENTAN:

 PRESENTAN:

Domínguez Lozano Rubén

Domínguez Lozano Rubén

Bárcenas Martínez Bernardo

Bárcenas Martínez Bernardo

Martínez Cedillo Marco Antonio

Martínez Cedillo Marco Antonio

(2)

*ÍNDICE

*ÍNDICE

Desarrollo

Desarrollo del del tema...tema...3...3 Operacione

Operaciones s con con listas listas circulares.circulares...4..4 Inserción de

Inserción de una una lista lista vacía...vacía...5...5 Inserción de

Inserción de una lista una lista no vacía...no vacía...6...6 Eliminaci

Eliminación ón al al inicio de inicio de una una lista....lista...8...8 Mostrar

Mostrar lista...lista...11...11 Destrucci

Destrucción ón de de una una lista...lista...12...12 *Ejemplos

*Ejemplos  Números

 Números al al azar...azar...13...13 Búsqueda...

Búsqueda...19...19 Inserción de un

Inserción de un elemento al principio de elemento al principio de la lista...la lista...20...20 Manual

Manual Técnico y Técnico y de de Usuario...Usuario...23...23

BIBLIOGRAFÍA BIBLIOGRAFÍA Programación en C Programación en C

Autores: Luis Joyanes Aguilar y Andres

Autores: Luis Joyanes Aguilar y Andres Castillo SanzCastillo Sanz Ed. Mc Graw Hill

Ed. Mc Graw Hill Primera edición Primera edición

Aprenda C en 21 dias Aprenda C en 21 dias

Autor: Lucas Sanchez Garcia Autor: Lucas Sanchez Garcia Ed. Adison Wensly

Ed. Adison Wensly Tercera edición Tercera edición

(3)

*Desarrollo del Tema

*Desarrollo del Tema

 Listas Circulares  Listas Circulares

La lista circular es una especie de lista enlazada simple o doblemente enlazada, pero que La lista circular es una especie de lista enlazada simple o doblemente enlazada, pero que  posee una característica adicional para el desplazamiento dentro de la lista, “ésta no  posee una característica adicional para el desplazamiento dentro de la lista, “ésta no

tiene,fin”. tiene,fin”.

Para que la lista sea sin fin, el puntero siguiente del último elemento apuntará hacia el Para que la lista sea sin fin, el puntero siguiente del último elemento apuntará hacia el 1er elemento de la lista en lugar de apuntar al valor NULL, como hemos visto en el caso 1er elemento de la lista en lugar de apuntar al valor NULL, como hemos visto en el caso dde e lliissttaas s eennllaazzaaddaas s ssiimmppllees s o o ddoobblleemmeenntte e eennllaazzaaddaass En las listas circulares, nunca se llega a una posición en la que ya no sea posible En las listas circulares, nunca se llega a una posición en la que ya no sea posible desplazarse.

desplazarse.

Cuando se llegue al último elemento, el desplazamiento volverá a comenzar desde el Cuando se llegue al último elemento, el desplazamiento volverá a comenzar desde el  primer

 primer elementelemento.o.

 III. La construcción del modelo de un

 III. La construcción del modelo de un elemento de la listaelemento de la lista

PPaarra a ddeeffiinniir r uun n eelleemmeenntto o dde e lla a lliissttaa, , eel l ttiippoo  struct  struct  serserá á utiutililizazado.do.

El

El eelleemmenentto o de de lla a lliiststa a cconontteendndrá rá uun n cacammpo po dadatto o y y uun n ppununtterero o sisigguiuieentnte.e. El puntero sigui

El puntero siguiente debe ser del ente debe ser del mismmismo o tipo que el tipo que el eleelementmento, o, en caso contrarien caso contrario o nono  podrá apuntar a elemento siguiente.

 podrá apuntar a elemento siguiente.

El puntero siguiente permitirá el acceso hacia el próximo elemento. El puntero siguiente permitirá el acceso hacia el próximo elemento. typedef struct ElementoLista {

typedef struct ElementoLista { char *dato;

char *dato;

struct ElementoLista *siguiente; struct ElementoLista *siguiente; }Elemento;

(4)

Para tener el control de l alista es preferible guardar ciertos elementos: el primer  Para tener el control de l alista es preferible guardar ciertos elementos: el primer  eelleemmeennttoo, , eel l úúllttiimmo o eelleemmeennttoo, , eel l nnúúmmeerro o dde e eelleemmeennttooss.. Par

Para a elello, lo, ototra ra estestrucructutura ra serserá á ututililizaizada da (no (no es es oblobligaigatotoriorio, , puepueden den seser r utiutililizadzadasas variables)

variables)

typedef struct ListaIdentificar { typedef struct ListaIdentificar {

Elemento *inicio; Elemento *inicio; Elemento *fin; Elemento *fin; int tamaño; int tamaño; }Lista; }Lista; El

El pupuntnterero o ininicicio io cocontntenendrdrá á la la didirereccccióión n dedel l prprimimer er elelememenento to de de la la liliststa.a. El

El pupuntnteero ro ffiin n ccononttenendrdrá á lla a didirerecccicióón n ddeel l uullttiimo mo eelleememenntto o dde e lla a lliiststaa.. L

La a vvaarriiaabbllee tamañotamaño ccoonnttiieenne e eel l nnúúmmeerro o dde e eelleemmeennttooss..

Cualquiera que sea la posición en la lista, los punteros inicio y fin siempre apuntaran Cualquiera que sea la posición en la lista, los punteros inicio y fin siempre apuntaran hhaacciia a eel l 11eer r y y eel l úúllttiimmo o eelleemmeenntto o rreessppeeccttiivvaammeennttee.. El campo

El campo tamañotamaño contendrá el número de elementos de la lista cualquiera sea lacontendrá el número de elementos de la lista cualquiera sea la

operación efectuada sobre la lista. operación efectuada sobre la lista.

 IV. Operaciones sobre las listas

 IV. Operaciones sobre las listas circularecircularess

A. Inicialización A. Inicialización

Modelo de la función Modelo de la función

void inicialización (Lista *lista); void inicialización (Lista *lista); Est

Esta a opeoperacracióión n debdebe e ser ser hechecha ha antantes es de de cuacualqulquieier r ototra ra opeoperacración ión sobsobre re la la lilistasta.. Inicializa el puntero inicio y el puntero fin con el puntero NULL, y el tamaño con el Inicializa el puntero inicio y el puntero fin con el puntero NULL, y el tamaño con el

vvaalloorr 00..

 La función:  La función:

void inicialización (Lista *lista){ void inicialización (Lista *lista){

lista->inicio = NULL; lista->inicio = NULL; lista->fin = NULL; lista->fin = NULL; tamaño = 0; tamaño = 0; }}

(5)

B. Inserción de un elemento en la lista B. Inserción de un elemento en la lista

A continuación el algoritmo de inserción y registro de los elementos: A continuación el algoritmo de inserción y registro de los elementos:

• declaración del elemento a insertar declaración del elemento a insertar  •

• asignación de la memoria para el nuevo elementoasignación de la memoria para el nuevo elemento •

• rellenar el contenido del campo de datosrellenar el contenido del campo de datos •

• actualizar los punteros hacia el 1er y ultimo elemento si es necesario.actualizar los punteros hacia el 1er y ultimo elemento si es necesario. o

o Caso particular: en una lista con un solo elemento, el 1er elemento es alCaso particular: en una lista con un solo elemento, el 1er elemento es al

mismo tiempo el ultimo. mismo tiempo el ultimo.

Actualizar el tamaño de la lista. Actualizar el tamaño de la lista.

1. Inserción en una lista

1. Inserción en una lista vacíavacía

Modelo de la función: Modelo de la función:

int ins_lista_circ_vacia(Lista * lista, char *dato); int ins_lista_circ_vacia(Lista * lista, char *dato); L

La a ffuunncciióón n ddeevvuueellvve e --1 1 een n ccaasso o dde e eerrrroorr, , ssi i nno o ddeevvuueellvve e 00.. Etapas:

Etapas:

• asignación de memoria para el nuevo elementoasignación de memoria para el nuevo elemento •

• rellenar el campo de datos del nuevo elementorellenar el campo de datos del nuevo elemento •

• el puntero siguiente del nuevo elemento apuntará hacia si mismo (el puntero siguiente del nuevo elemento apuntará hacia si mismo (es la etapaes la etapa que vuelve a la lista circular 

que vuelve a la lista circular )) •

• los punteros inicio y fin apuntaran hacia el nuevo elementolos punteros inicio y fin apuntaran hacia el nuevo elemento •

(6)

 La función:  La función:

/* inserción en una lista vacía */ /* inserción en una lista vacía */

int ins_lista_circ_vacia(Lista * lista, char *dato){ int ins_lista_circ_vacia(Lista * lista, char *dato){

Elemento *nuevo_elemento; Elemento *nuevo_elemento;

if ((nuevo_elemento = (Elemento *) malloc (

if ((nuevo_elemento = (Elemento *) malloc (sizeof (Elementosizeof (Elemento)))))) == NULL)

== NULL) return -1; return -1;

if ((nuevo_element

if ((nuevo_elemento->dato = (char *) o->dato = (char *) malloc (50 * sizeof (char)))malloc (50 * sizeof (char))) == NULL)

== NULL) return -1; return -1;

strcpy (nuevo_elemento->dato, dato); strcpy (nuevo_elemento->dato, dato);

nuevo_elemento->siguiente = nuevo_elemento; nuevo_elemento->siguiente = nuevo_elemento; lista->inicio = nuevo_elemento; lista->inicio = nuevo_elemento; lista->fin = nuevo_elemento; lista->fin = nuevo_elemento; lista->tamaño++; lista->tamaño++; return 0; return 0; }}

2. Inserción en una lista no vacía 2. Inserción en una lista no vacía

Modelo de la función: Modelo de la función:

int ins_lista_circ(Lista * lista, Elemento *actual, char *dato); int ins_lista_circ(Lista * lista, Elemento *actual, char *dato);

L

La a ffuunncciióón n ddeevvuueellvve e --1 1 een n ccaasso o dde e eerrrroorr, , ssi i nno o ddeevvuueellvve e 00.. Etapas:

Etapas:

• asignación de memoria para el nuevo elementoasignación de memoria para el nuevo elemento •

• rellenar el campo de datos del nuevo elementorellenar el campo de datos del nuevo elemento •

• el el puntpuntero ero sigusiguientiente e del del nuevnuevo o eleelementmento o apunapunta ta hacihacia a la la diredirecciócción n del primer del primer 

elemento (conservar la lista

elemento (conservar la lista circular)circular)

• el puntero inicio no cambiael puntero inicio no cambia •

• el puntero fin apunta hacia el nuevo elementoel puntero fin apunta hacia el nuevo elemento •

(7)

 La función:  La función:

/* inserción en una lista no vacía */ /* inserción en una lista no vacía */

int ins_lista_circ(Lista * lista, Elemento *actual, char *dato){ int ins_lista_circ(Lista * lista, Elemento *actual, char *dato){

Elemento *nuevo_elemento; Elemento *nuevo_elemento;

if ((nuevo_elemento = (Elemento *) malloc (

if ((nuevo_elemento = (Elemento *) malloc (sizeof (Elementosizeof (Elemento)))))) == NULL)

== NULL) return -1; return -1;

if ((nuevo_element

if ((nuevo_elemento->dato = (char *) o->dato = (char *) malloc (50 * sizeof (char)))malloc (50 * sizeof (char))) == NULL)

== NULL) return -1; return -1;

strcpy (nuevo_elemento->dato, dato); strcpy (nuevo_elemento->dato, dato); if(actual != lista->fin) if(actual != lista->fin) return -1; return -1; nuevo_elemento->siguiente = actual->siguiente; nuevo_elemento->siguiente = actual->siguiente; actual->siguiente = nuevo_elemento; actual->siguiente = nuevo_elemento; lista->fin = nuevo_elemento; lista->fin = nuevo_elemento; lista->tamaño++; lista->tamaño++; Return 0; Return 0; }}

(8)

C. Eliminación de un elemento en la lista C. Eliminación de un elemento en la lista

A continuación el algoritmo de eliminación de un elemento de la lista: A continuación el algoritmo de eliminación de un elemento de la lista:

• uso de un puntero temporal para guardar la dirección de los elementos a eliminar uso de un puntero temporal para guardar la dirección de los elementos a eliminar  •

• el elemento a eliminar se encuentra después del elemento actualel elemento a eliminar se encuentra después del elemento actual

Hacer apuntar el puntero siguiente del elemento actual hacia la dirección del puntero Hacer apuntar el puntero siguiente del elemento actual hacia la dirección del puntero siguiente del elemento a eliminar 

siguiente del elemento a eliminar 

• liberar la memoria ocupada por el elemento eliminadoliberar la memoria ocupada por el elemento eliminado •

• actualizar el tamaño de la listaactualizar el tamaño de la lista

Para eliminar un elemento de la lista hay varias situaciones: Para eliminar un elemento de la lista hay varias situaciones:

• 1. Eliminación dentro de la lista1. Eliminación dentro de la lista •

• 2. Eliminación del último elemento de la lista2. Eliminación del último elemento de la lista

1. Eliminación al inicio de la 1. Eliminación al inicio de la listalista

Modelo de la función: Modelo de la función:

int sup_list_circ(Lista *lista); int sup_list_circ(Lista *lista);

L

La a ffuunncciióón n ddeevvuueellvve e --1 1 een n ccaasso o dde e eerrrroorr, , ssi i nno o ddeevvuueellvve e 00.. Etapas:

Etapas:

• el puntero sup_elemento contendrá la dirección del 1er elementoel puntero sup_elemento contendrá la dirección del 1er elemento •

• el puntero inicio apuntara hacia el 2do elementoel puntero inicio apuntara hacia el 2do elemento •

• el puntero siguiente del ultimo elemento apuntara hacia el 1er el puntero siguiente del ultimo elemento apuntara hacia el 1er elementelemento (o ( que eraque era el 2do antes de la eliminación

el 2do antes de la eliminación)) •

(9)

 La función:  La función:

/* eliminación al inicio de la lista */ /* eliminación al inicio de la lista */ int sup_lista_circ(Lista * lista){ int sup_lista_circ(Lista * lista){

if (lista->tamaño < 2) if (lista->tamaño < 2) return -1; return -1; Elemento *sup_element; Elemento *sup_element; sup_elemento = lista->inicio; sup_elemento = lista->inicio; lista->inicio = lista->inicio->siguiente; lista->inicio = lista->inicio->siguiente; lista->fin->siguiente = lista->inicio; lista->fin->siguiente = lista->inicio; free

free (sup_eleme(sup_elemento->dato);nto->dato); free

free (sup_eleme(sup_elemento);nto); lista->tamaño--; lista->tamaño--; return 0;

return 0; }}

2. Eliminación en una lista con un solo elemento 2. Eliminación en una lista con un solo elemento

Modelo de la función: Modelo de la función:

int sup_list_circ_unica(Lista *lista); int sup_list_circ_unica(Lista *lista);

(10)

L

La a ffuunncciióón n ddeevvuueellvve e --1 1 een n ccaasso o dde e eerrrroorr, , ssi i nno o ddeevvuueellvve e 00.. Etapas:

Etapas:

• el puntero sup_elemento contendrá la dirección del elemento (la lista contieneel puntero sup_elemento contendrá la dirección del elemento (la lista contiene

un solo elemento) un solo elemento)

• el puntero inicio apuntara hacia NULLel puntero inicio apuntara hacia NULL •

• el puntero fin apuntara hacia NULLel puntero fin apuntara hacia NULL •

• el tamaño de la lista disminuirá un elemento.el tamaño de la lista disminuirá un elemento.

 La función:  La función:

/* eliminación en una lista con un solo elemento*/ /* eliminación en una lista con un solo elemento*/ int sup_lista_circ_unica(Lista *lista){

int sup_lista_circ_unica(Lista *lista){ if (lista->tamaño != 1) if (lista->tamaño != 1) return -1; return -1; Elemento *sup_elemento; Elemento *sup_elemento; sup_elemento = lista->inicio; sup_elemento = lista->inicio; lista->inicio = NULL; lista->inicio = NULL; lista->fin = NULL; lista->fin = NULL; free

(11)

free

free (sup_eleme(sup_elemento);nto); lista->tamaño--; lista->tamaño--; return 0; return 0; }}  D. Mostrar la lista  D. Mostrar la lista

Para mostrar la lista completa, es necesario posicionarse al inicio de la lista (el puntero Para mostrar la lista completa, es necesario posicionarse al inicio de la lista (el puntero inicio lo permitirá). Luego, utilizando el puntero siguiente de cada elemento, la lista es inicio lo permitirá). Luego, utilizando el puntero siguiente de cada elemento, la lista es rreeccoorrrriidda a ddeel l 11eer r aal l uullttiimmo o eelleemmeennttoo..

En comparación con las listas simples y doblemente enlazadas, en el que la condición En comparación con las listas simples y doblemente enlazadas, en el que la condición  para detenerse esta dada por el puntero siguiente del ultimo elemento, que vale NULL,  para detenerse esta dada por el puntero siguiente del ultimo elemento, que vale NULL,   p

  parara a la la liliststa a cicircrculularar, , no no hahay y pupuntnto o de de dedetetencncióión, n, a a memenonos s quque e elelijijamamos os ununo.o. A continuación dos variantes de visualización:

A continuación dos variantes de visualización:

• Mostrar la lista (del 1er al último elemento)Mostrar la lista (del 1er al último elemento) •

• Mostrar la lista sin una condición para detenerse.Mostrar la lista sin una condición para detenerse. •

1. Mostrar la lista (del 1er a

1. Mostrar la lista (del 1er al último elemento)l último elemento)

Ut

Utiilliizazareremomos s eel l ttamamaaño ño dde e lla a lliiststa a ccoomo mo lla a cconondidicciióón n ppaara ra dedetteenenersrsee.. La función:

La función:

/* mostrar la lista */ /* mostrar la lista */

void mostrar (Lista * lista){ void mostrar (Lista * lista){

Elemento *actual; Elemento *actual; actual = lista->inicio; actual = lista->inicio; int i; int i; for(i=0;i<lista->tamaño;++i){ for(i=0;i<lista->tamaño;++i){ printf ("%p -

printf ("%p - %s\n", actual, actual->dato);%s\n", actual, actual->dato); actual = actual->siguiente;

actual = actual->siguiente; }}

}}

2. Mostrar la lista sin

2. Mostrar la lista sin una condición para detenerse (indefinidamente)una condición para detenerse (indefinidamente)

La función: La función: /* recorrer

(12)

void mostrar_indefini

void mostrar_indefinidamente (Lista damente (Lista * * lista){lista){ Elemento *actual; Elemento *actual; actual = lista->inicio; actual = lista->inicio; while (1){ while (1){ printf ("%p -

printf ("%p - %s\n", actual, actual->dato);%s\n", actual, actual->dato); actual = actual->siguiente; actual = actual->siguiente; }} }}

E. Destrucción de la lista

E. Destrucción de la lista

Para destruir la lista completa, he utilizado al eliminación al inicio de la lista ya que el Para destruir la lista completa, he utilizado al eliminación al inicio de la lista ya que el tamaño es mayor a 1, luego la eliminación en una lista con un solo elemento. tamaño es mayor a 1, luego la eliminación en una lista con un solo elemento. La función:

La función:

/* destruir la lista */ /* destruir la lista */ void destruir (Lista *

void destruir (Lista * lista){lista){ while (lista->tamaño > 0){ while (lista->tamaño > 0){ if (lista->tamaño > 1) if (lista->tamaño > 1) sup_lista_circ (lista); sup_lista_circ (lista); else else sup_lista_circ_unica(lista); sup_lista_circ_unica(lista); }}

(13)

*Ejemplos

*Ejemplos

 Programa Numeros al Azar: (ejemplo1.exe)  Programa Numeros al Azar: (ejemplo1.exe)

En este programa se

En este programa se escriben las declaracioneescriben las declaraciones y s y funciones necesarifunciones necesarias para as para trabajar entrabajar en una lista circular.

una lista circular.

Análisis del problema: Análisis del problema: El

El prprogograrama ma se se esestrtrucuctutura ra de de la la sisiguguieientnte e foformrma:a:.P.Pririmemeraramementnte e se se hahacecen n lalass declaraciones necesarias para tratar la Lista Circular.El programa principal se encarga declaraciones necesarias para tratar la Lista Circular.El programa principal se encarga de realizar las llamadas correspondientes.VaciaLc. Es una función que crea una lista de realizar las llamadas correspondientes.VaciaLc. Es una función que crea una lista circular vacía..EsVa

circular vacía..EsVaciaLc. Es una función que ciaLc. Es una función que da verdadero cuando la lista circular estada verdadero cuando la lista circular esta vacía..NuevoNodoLc. Es una función que devuelve un puntero a un nuevo nodo en el vacía..NuevoNodoLc. Es una función que devuelve un puntero a un nuevo nodo en el que se ha almacenado el dato x..InsertaListaCircular. Realiza la inserción de una lista que se ha almacenado el dato x..InsertaListaCircular. Realiza la inserción de una lista circular del valor dato. Lo hace teniendo en cuenta que primero es un puntero que circular del valor dato. Lo hace teniendo en cuenta que primero es un puntero que apunta al último elemento que se añadió a la lista. Lo que hace es insertar un nuevo apunta al último elemento que se añadió a la lista. Lo que hace es insertar un nuevo nodo en la Li

nodo en la Lista Circsta Circular comular como último último elemeo elemento, parnto, para a lo cualo cual aparte de rel aparte de realializar zar loslos correspondien

correspondientes enlaces, mueve el punttes enlaces, mueve el puntero primero para que apunte siempre ero primero para que apunte siempre al últimoal último elemento que se aña

elemento que se añadió. De esta forma el primer elemdió. De esta forma el primer elemento de la lista siemento de la lista siempre estará pre estará enen el nodo Primero->sig..GeneraPorElFinalLc. Crea una lista circular de números enteros el nodo Primero->sig..GeneraPorElFinalLc. Crea una lista circular de números enteros aleatorios, realizando las inserciones con la función InsertaListaCircular.

aleatorios, realizando las inserciones con la función InsertaListaCircular.

.EscribeListaLc. Se encarga de eliminar el primer nodo de la lista circular que como .EscribeListaLc. Se encarga de eliminar el primer nodo de la lista circular que como sabemos estará siempre en Primero->sig. Solo hay que tener en cuenta que si la lista sabemos estará siempre en Primero->sig. Solo hay que tener en cuenta que si la lista esta vací

esta vacía no se puede a no se puede borrar. Si tienborrar. Si tiene un solo dae un solo dato la listto la lista se quedara a se quedara vacía vacía y habrá quey habrá que liberar memoria

liberar memoria. Si tiene más de un dat. Si tiene más de un dato habrá que mover el puo habrá que mover el puntero ntero Primero->sig aPrimero->sig a Primero->sig->sig; y liberar la memoria del nodo que hemos puenteado.

Primero->sig->sig; y liberar la memoria del nodo que hemos puenteado. .Eli

.EliminaminarLc. rLc. Se encargSe encarga de a de buscbuscar la primera apariar la primera aparición de dato y borrarla de la listación de dato y borrarla de la lista circular. Lo hace de la siguiente forma. Si la lista esta vacía no hay nada que hacer. En circular. Lo hace de la siguiente forma. Si la lista esta vacía no hay nada que hacer. En otro caso con una variable lógica enc y con un puntero ptr realiza la búsqueda del dato, otro caso con una variable lógica enc y con un puntero ptr realiza la búsqueda del dato, controlando no realizar un bucle infinito. Una vez encontrado el elementó se realiza el controlando no realizar un bucle infinito. Una vez encontrado el elementó se realiza el  borrado teniendo en cuenta: si la lista contiene un solo valor se quedará vacía; si el nodo  borrado teniendo en cuenta: si la lista contiene un solo valor se quedará vacía; si el nodo

a borrar por Primero, habrá que

a borrar por Primero, habrá que mover este puntero; en otro caso no habrá que moverlo.mover este puntero; en otro caso no habrá que moverlo. Siempre que se borre un nodo habrá que puentearlo.

(14)

#include<stdio.h> #include<stdio.h> #include<stdlib.h> #include<stdlib.h> #include<time.h> #include<time.h> #define MX 100 #define MX 100 #include<conio.h> #include<conio.h>

typedef int Item; typedef int Item;

typedef struct NuevoNodo typedef struct NuevoNodo

{ { Item el; Item el; struct NuevoNodo*sig; struct NuevoNodo*sig; }NodoLc; }NodoLc; void VaciaLc(NodoLc**Primero); void VaciaLc(NodoLc**Primero);

int EsVaciaLc(NodoLc *Primero); int EsVaciaLc(NodoLc *Primero);

NodoLc* NuevoNodoLc(Item x); NodoLc* NuevoNodoLc(Item x);

void InsertaListaCircular(NodoLc **Primero, Item datos); void InsertaListaCircular(NodoLc **Primero, Item datos);

void GeneraPorElFinalLc(NodoLc **Primero); void GeneraPorElFinalLc(NodoLc **Primero);

void EscribeListaLc(NodoLc *Primero); void EscribeListaLc(NodoLc *Primero);

void EliminarPrimeroLc(NodoLc **Primero); void EliminarPrimeroLc(NodoLc **Primero);

void main (void) void main (void)

{ { //clrscr(); //clrscr(); NodoLc *Primero; NodoLc *Primero; GeneraPorElFinalLc(&Primero); GeneraPorElFinalLc(&Primero); EscribeListaLc(Primero); EscribeListaLc(Primero);

(15)

} } void VaciaLc(NodoLc**Primero) void VaciaLc(NodoLc**Primero) { { *Primero=NULL; *Primero=NULL; } }

int EsVaciaLc(NodoLc *Primero) int EsVaciaLc(NodoLc *Primero)

{ { return (Primero==NULL); return (Primero==NULL); } } NodoLc*NuevoNodoLc(Item x) NodoLc*NuevoNodoLc(Item x) { { NodoLc *nn; NodoLc *nn; nn=(NodoLc*)malloc(sizeof(NodoLc)); nn=(NodoLc*)malloc(sizeof(NodoLc)); nn-> el = x; nn-> sig=nn; nn-> el = x; nn-> sig=nn; return nn; return nn; } }

void InsertaListaCircular (NodoLc **Primero,Item dato) void InsertaListaCircular (NodoLc **Primero,Item dato)

{ { NodoLc* nn; NodoLc* nn; nn=NuevoNodoLc(dato); nn=NuevoNodoLc(dato); if (*Primero!=NULL) if (*Primero!=NULL) { { //nn->sig= *Lc ->sig; //nn->sig= *Lc ->sig; (*Primero) ->sig=nn; (*Primero) ->sig=nn; } } *Primero = nn; *Primero = nn; } }

(16)

void GeneraPorElFinalLc(NodoLc **Primero) void GeneraPorElFinalLc(NodoLc **Primero)

{ { Item d; Item d; NodoLc *p; NodoLc *p; p=NULL; randomize(); p=NULL; randomize(); for (d=random(MX); d; ) for (d=random(MX); d; ) { { InsertaListaCircular (&p,d); InsertaListaCircular (&p,d); d= random (MX); d= random (MX); } } *Primero=p; *Primero=p; } }

void EscribeListaLc(NodoLc *Primero) void EscribeListaLc(NodoLc *Primero)

{ { NodoLc *ptr; NodoLc *ptr; int k=0; int k=0; ptr= Primero; ptr= Primero; if(ptr!=NULL) if(ptr!=NULL) { { ptr=ptr->sig; ptr=ptr->sig; do do { { k++; k++; if(k%10==0) if(k%10==0) { { printf("\n"); printf("\n");

(17)

} } else else { { printf(" "); printf(" "); printf("%d",ptr->el); printf("%d",ptr->el); } } ptr=ptr->sig; ptr=ptr->sig; } } while (ptr!=Primero->sig); while (ptr!=Primero->sig); } } } }

void EliminaPrimeroLc(NodoLc **Primero) void EliminaPrimeroLc(NodoLc **Primero)

{ { NodoLc *ptr, *p; NodoLc *ptr, *p; ptr=*Primero; ptr=*Primero; if(ptr!=NULL) if(ptr!=NULL) { { p=ptr->sig;

p=ptr->sig; //p //p hay hay que que borrarloborrarlo

if (p==ptr) if (p==ptr) *Primero=NULL; *Primero=NULL; else else ptr->sig=p->sig; ptr->sig=p->sig; free(p); free(p); } } } }

void EliminarLc (NodoLc** Primero,Item dato) void EliminarLc (NodoLc** Primero,Item dato)

{ { NodoLc *ptr,*p; NodoLc *ptr,*p; int enc = 0; int enc = 0;

(18)

ptr = *Primero; ptr = *Primero; if (ptr==NULL) if (ptr==NULL) return; return;

//busqueda mientras no encontrado y no de la vuelta //busqueda mientras no encontrado y no de la vuelta

while ((ptr->sig!=*Primero)&&(!enc)) while ((ptr->sig!=*Primero)&&(!enc)) { { enc=(ptr->sig->el==dato); enc=(ptr->sig->el==dato); if (!enc) if (!enc) ptr = ptr->sig; ptr = ptr->sig;

}enc = (ptr->sig->el==dato); //aqui se debe encontrar el dato }enc = (ptr->sig->el==dato); //aqui se debe encontrar el dato

if (enc) if (enc)

{p=ptr->sig; {p=ptr->sig;

if(*Primero==(*Primero)->sig) //solo hay un dato if(*Primero==(*Primero)->sig) //solo hay un dato

*Primero=NULL; *Primero=NULL; else else { { if (p==*Primero) if (p==*Primero) *Primero= ptr; *Primero= ptr; ptr->sig=p->sig; ptr->sig=p->sig; } } free(p); free(p); } }  Ejecutado  Ejecutado

(19)

 Programa: Búsqueda (lista cir.exe)  Programa: Búsqueda (lista cir.exe)

Definición: Definición:

La Búsqueda su objetivo es encontrar un dato en el arreglo Info, si lo encuentra lo La Búsqueda su objetivo es encontrar un dato en el arreglo Info, si lo encuentra lo desplegara en la pantalla, si no lo encuentra no desplegara nada ya que el dato no se desplegara en la pantalla, si no lo encuentra no desplegara nada ya que el dato no se encuentra en el arreglo Info.

encuentra en el arreglo Info. Programa: Programa: #include <conio.h> #include <conio.h> #include <iostream.h> #include <iostream.h>

int Busqueda(int Info[8],int Indice[8],int Inicio,int Disp,int int Busqueda(int Info[8],int Indice[8],int Inicio,int Disp,int Elemento); Elemento); void main() void main() { { int Info[8]={0,10,0,9,5,3,0,20}; int Info[8]={0,10,0,9,5,3,0,20}; int Indice[8]={5,7,6,1,0,3,-999,4}; int Indice[8]={5,7,6,1,0,3,-999,4}; int Inicio=0,Disp=2,Elemento,Res; int Inicio=0,Disp=2,Elemento,Res;

cout<<"Que Numero deseas buscar?"; cout<<"Que Numero deseas buscar?";

cin>>Elemento; cin>>Elemento; Res=Busqueda(Info,Indice,Inicio,Disp,Elemento); Res=Busqueda(Info,Indice,Inicio,Disp,Elemento); if(Res==-999) if(Res==-999) cout<<"Dato No Encontrado..."; cout<<"Dato No Encontrado..."; getch(); getch(); } }

int Busqueda(int Info[8],int Indice[8],int Inicio,int Disp,int int Busqueda(int Info[8],int Indice[8],int Inicio,int Disp,int Elemento) Elemento) { { int Apuntador=Indice[Inicio]; int Apuntador=Indice[Inicio]; while(Apuntador!=Inicio) while(Apuntador!=Inicio)

(20)

{ { if(Elemento==Info[Apuntador]) if(Elemento==Info[Apuntador]) { {

cout<<"Numero "<<Info[Apuntador]<<" encontrado..."; cout<<"Numero "<<Info[Apuntador]<<" encontrado...";

return Apuntador; return Apuntador; } } Apuntador=Indice[Apuntador]; Apuntador=Indice[Apuntador]; } } return Apuntador; return Apuntador; } }

*Inserción de un elemento (numero) al Principio (nodo.exe) *Inserción de un elemento (numero) al Principio (nodo.exe)

Definición: Definición:

La Inserción al Principio básicamente busca si existe algún lugar disponible en el La Inserción al Principio básicamente busca si existe algún lugar disponible en el arreglo Info y lo agrega

(21)

Programa: Programa: #include <conio.h> #include <conio.h> #include <iostream.h> #include <iostream.h>

void Recorrido(int Info[8],int Indice[8],int Inicio,int Disp); void Recorrido(int Info[8],int Indice[8],int Inicio,int Disp);

void InsPr(int Info[8],int Indice[8],int Inicio,int Disp,int void InsPr(int Info[8],int Indice[8],int Inicio,int Disp,int Elemento); Elemento); void main() void main() { { int Info[8]={0,10,0,9,5,3,0,20}; int Info[8]={0,10,0,9,5,3,0,20}; int Indice[8]={5,7,6,1,0,3,-999,4}; int Indice[8]={5,7,6,1,0,3,-999,4}; int Inicio=0,Disp=2,Elemento,Res; int Inicio=0,Disp=2,Elemento,Res; cout<<"Lista Original\n"; cout<<"Lista Original\n"; Recorrido(Info,Indice,Inicio,Disp); Recorrido(Info,Indice,Inicio,Disp);

cout<<"Que Numero deseas Insertar?"; cout<<"Que Numero deseas Insertar?";

cin>>Elemento; cin>>Elemento; InsPr(Info,Indice,Inicio,Disp,Elemento); InsPr(Info,Indice,Inicio,Disp,Elemento); getch(); getch(); } }

void Recorrido(int Info[8],int Indice[8],int Inicio,int Disp) void Recorrido(int Info[8],int Indice[8],int Inicio,int Disp)

{int Apuntador=Indice[Inicio]; {int Apuntador=Indice[Inicio]; while(Apuntador!=Inicio) while(Apuntador!=Inicio) { { cout<<Info[Apuntador]<<endl; cout<<Info[Apuntador]<<endl; Apuntador=Indice[Apuntador]; Apuntador=Indice[Apuntador]; } } } }

void InsPr(int Info[8],int Indice[8],int Inicio,int Disp,int void InsPr(int Info[8],int Indice[8],int Inicio,int Disp,int Elemento)

(22)

{ { if(Disp!=-999) if(Disp!=-999) { { int Apuntador=Disp; int Apuntador=Disp; Disp=Indice[Disp]; Disp=Indice[Disp]; Info[Apuntador]=Elemento; Info[Apuntador]=Elemento; Indice[Apuntador]=Indice[Inicio]; Indice[Apuntador]=Indice[Inicio]; Indice[Inicio]=Apuntador; Indice[Inicio]=Apuntador; Recorrido(Info,Indice,Inicio,Disp); Recorrido(Info,Indice,Inicio,Disp); } } else else cout<<"Overflow..."; cout<<"Overflow..."; } }

(23)

*Manual Técnico y de Usuario

*Manual Técnico y de Usuario

*Inserción de un elemento (numero) al Principio *Inserción de un elemento (numero) al Principio

Definición: Definición:

La Inserción al Principio básicamente busca si existe algún lugar disponible en el La Inserción al Principio básicamente busca si existe algún lugar disponible en el arreglo Info y lo agrega

arreglo Info y lo agrega como primer Nodo si es como primer Nodo si es que es posible.que es posible. Detalle:

Detalle:

Hace una comparación para ver si es

Hace una comparación para ver si es posible insertposible insertar otro Elemento al arreglo Info, ar otro Elemento al arreglo Info, parapara esto checa si Disp es Diferente de Nulo. Si no cumple con la condición se desplegar  esto checa si Disp es Diferente de Nulo. Si no cumple con la condición se desplegar  “Sobre Carga” ya que no se

“Sobre Carga” ya que no se puede insertar un Nuevo Elemento. Si es cierto Apuntador puede insertar un Nuevo Elemento. Si es cierto Apuntador  toma el valor de Inicio, Disp cambia a Indice[Disp] ya que el primer Disp tomara el toma el valor de Inicio, Disp cambia a Indice[Disp] ya que el primer Disp tomara el valor del Nuevo Elemento, después de esto solo copia la información de Elemento al valor del Nuevo Elemento, después de esto solo copia la información de Elemento al arreglo Info en la posición que guarda Apuntador, Indice[Apuntador] toma el valor de arreglo Info en la posición que guarda Apuntador, Indice[Apuntador] toma el valor de Indice[Inici

Indice[Inicio] y o] y finalmefinalmente Indice[Inicio] toma el valor nte Indice[Inicio] toma el valor de Apuntador.de Apuntador.

 Algoritmo:  Algoritmo:

InsPr(Inicio, Disp, Info,

InsPr(Inicio, Disp, Info, Indice, Elemento)Indice, Elemento) Si Disp ≠ Nill entonces:

Si Disp ≠ Nill entonces: Apuntador → Disp Apuntador → Disp Disp →

Disp → Indice[Disp]Indice[Disp]

Info[Apuntador] → Elemento Info[Apuntador] → Elemento Indice[Apunta

Indice[Apuntador] dor] → → Indice[IniciIndice[Inicio]o] Indice[Inici

Indice[Inicio] o] → Apuntador → Apuntador  Si no: Imprimir “Sobre Carga” Si no: Imprimir “Sobre Carga” Salir  Salir  Diagrama: Diagrama: Programa: Programa:

(24)

#include <conio.h> #include <conio.h> #include <iostream.h> #include <iostream.h>

void Recorrido(int Info[8],int Indice[8],int Inicio,int

void Recorrido(int Info[8],int Indice[8],int Inicio,int Disp);Disp); void InsPr(int Info[8],int Indice[8],int Inicio,int Disp,int void InsPr(int Info[8],int Indice[8],int Inicio,int Disp,int Elemento); Elemento); void main() void main() { { int

int Info[8]={0,Info[8]={0,10,0,9,5,3,010,0,9,5,3,0,20};,20}; int

int Indice[8]={Indice[8]={5,7,6,1,0,3,5,7,6,1,0,3,-999,4};-999,4}; int

int Inicio=0,DiInicio=0,Disp=2,Elementsp=2,Elemento,Res;o,Res; cout<<"Lista Original\n";

cout<<"Lista Original\n"; Recorrido(In

Recorrido(Info,Indice,Ifo,Indice,Inicio,Disp);nicio,Disp); cout<<"Que Numero deseas Insertar?"; cout<<"Que Numero deseas Insertar?"; cin>>Elemento; cin>>Elemento; InsPr(Info,Indice,Inicio,Disp,Elemento); InsPr(Info,Indice,Inicio,Disp,Elemento); getch(); getch(); } }

void Recorrido(int Info[8],int Indice[8],int Inicio,int Disp) void Recorrido(int Info[8],int Indice[8],int Inicio,int Disp) {

{ int

int Apuntador=IApuntador=Indice[Iniciondice[Inicio];]; while(Apuntador!=Inicio) while(Apuntador!=Inicio) { { cout<<Info[Apuntador]<<endl; cout<<Info[Apuntador]<<endl; Apuntador=Indice[Apuntador]; Apuntador=Indice[Apuntador]; } } } }

void InsPr(int Info[8],int Indice[8],int Inicio,int Disp,int Elemento) void InsPr(int Info[8],int Indice[8],int Inicio,int Disp,int Elemento) {if(Disp!=-999)

{if(Disp!=-999) {

{ int

(25)

Info[Apuntador]=Elemento; Info[Apuntador]=Elemento; Indice[Apunt

Indice[Apuntador]=Indicador]=Indice[Inicio];e[Inicio]; Indice[Inicio]=Apuntador;

Indice[Inicio]=Apuntador; Recorrido(In

Recorrido(Info,Indice,Ifo,Indice,Inicio,Disp);nicio,Disp); } } else else cout<<"Overflow..."; cout<<"Overflow..."; } }  Programa: Búsqueda  Programa: Búsqueda

(26)

Definición: Definición:

La Búsqueda su objetivo es encontrar un dato en el arreglo Info, si lo encuentra lo La Búsqueda su objetivo es encontrar un dato en el arreglo Info, si lo encuentra lo desplegara en la pantalla, si no lo encuentra no desplegara nada ya que el dato no se desplegara en la pantalla, si no lo encuentra no desplegara nada ya que el dato no se encuentra en el arreglo Info.

encuentra en el arreglo Info. Detalle:

Detalle:

Apuntador toma el valor de Inicio, después ve si la condición cumple para efectuar un Apuntador toma el valor de Inicio, después ve si la condición cumple para efectuar un Ciclo mientras Apuntador sea diferente de 0, si cumple lo que hace a continuación es la Ciclo mientras Apuntador sea diferente de 0, si cumple lo que hace a continuación es la comparació

comparación de Elemento (El dato n de Elemento (El dato que vamos a buscar) con Info[Apuntador], cuando loque vamos a buscar) con Info[Apuntador], cuando lo encuentre lo desplieg

encuentre lo despliega y a y sale del método. Si no, regresa el valor de sale del método. Si no, regresa el valor de Apuntador para asíApuntador para así saber que no se encontró el dato.

saber que no se encontró el dato. Algoritmo:

Algoritmo: Recorrido(Inici

Recorrido(Inicio, o, Info, Indice, Info, Indice, Elemento)Elemento) Apuntador → Indice[Inicio]

Apuntador → Indice[Inicio]

Repetir mientras Apuntador ≠ Inicio Repetir mientras Apuntador ≠ Inicio Si Elemento =

Si Elemento = Info[ApuntadoInfo[Apuntador] entonces:r] entonces: Imprimir I

Imprimir Info[Apuntadnfo[Apuntador]or] Regresa Apuntador 

Regresa Apuntador  Apuntador →

Apuntador → Indice[ApuntIndice[Apuntador]ador] Fin del ciclo

Fin del ciclo

Regresar Apuntador  Regresar Apuntador  Diagrama: Diagrama: Programa: Programa:

(27)

#include <iostream.h> #include <iostream.h>

int Busqueda(int Info[8],int

int Busqueda(int Info[8],int Indice[8],iIndice[8],int nt Inicio,int Disp,intInicio,int Disp,int Elemento); Elemento); void main() void main() { { int

int Info[8]={0,Info[8]={0,10,0,9,5,3,010,0,9,5,3,0,20};,20}; int

int Indice[8]={Indice[8]={5,7,6,1,0,3,5,7,6,1,0,3,-999,4};-999,4}; int

int Inicio=0,DiInicio=0,Disp=2,Elementsp=2,Elemento,Res;o,Res; cout<<"Que Numero deseas buscar?"; cout<<"Que Numero deseas buscar?"; cin>>Elemento; cin>>Elemento; Res=Busqueda(Info,Indice,Inicio,Disp,Elemento); Res=Busqueda(Info,Indice,Inicio,Disp,Elemento); if(Res==-999) if(Res==-999) cout<<"Dato No

cout<<"Dato No Encontrado..Encontrado...";."; getch();

getch(); }

}

int Busqueda(int Info[8],int

int Busqueda(int Info[8],int Indice[8],iIndice[8],int nt Inicio,int Disp,intInicio,int Disp,int Elemento)

Elemento) {

{ int

int Apuntador=IApuntador=Indice[Iniciondice[Inicio];]; while(Apuntador!=Inicio) while(Apuntador!=Inicio) { { if(Elemento==Info[Apuntador]) if(Elemento==Info[Apuntador]) { {

cout<<"Numero "<<Info[Apuntador]<<" encontrado..."; cout<<"Numero "<<Info[Apuntador]<<" encontrado..."; return Apuntador; return Apuntador; } } Apuntador=Indice[Apuntador]; Apuntador=Indice[Apuntador]; } } return Apuntador; return Apuntador; } }

Referencias

Documento similar

Se dice que la Administración no está obligada a seguir sus pre- cedentes y puede, por tanto, conculcar legítimamente los principios de igualdad, seguridad jurídica y buena fe,

Desde la ocupación marroquí y la retirada definitiva de España de la zona, el 26 de febrero de 1976, cada año el Consejo de Seguridad de las Naciones Unidas prorroga la misión para

Puesto que la familia es el contexto más influyente y determinante para ellos, se analizará qué consecuencias tiene que la lectura sea valorada y considerada

Primeros ecos de la Revolución griega en España: Alberto Lista y el filohelenismo liberal conservador español 369 Dimitris Miguel Morfakidis Motos.. Palabras de clausura

Zechmeister, entre otros... significativo de la

37 El TPI, en los fundamentos jurídicos del 149 al 154 de la sentencia «Virgia- micina», examinó las dos actividades complementarias que integran la evaluación de riesgos:

En su natal Caracas, donde se formó Bello como latinista, no pudo tener la oportunidad de aprender griego. Cuando nació, ya hacía 14 años que los jesuitas habían sido