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
*Í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
*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;
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; }}
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 •
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 •
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; }}
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)) •
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);
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
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
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); }}
*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.
#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);
} } 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; } }
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");
} } 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;
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
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)
{ { 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
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)
{ { 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..."; } }
*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:
#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
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
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:
#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; } }