Beruflich Dokumente
Kultur Dokumente
“Estructura y Base de
Datos”
“LISTAS CIRCULARES”
Grupo 3C4V
PRESENTAN:
Página
1
*ÍNDICE
Mostrar lista.......................................................................................................11
*Ejemplos
Números al azar................................................................................................13
Búsqueda..........................................................................................................19
BIBLIOGRAFÍA
Programación en C
Primera edición
Aprenda C en 21 dias
Tercera edición
Página
2
*Desarrollo del Tema
Listas Circulares
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
tiene,fin”.
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
de listas enlazadas simples o doblemente enlazadas
En las listas circulares, nunca se llega a una posición en la que ya no sea posible
desplazarse.
Cuando se llegue al último elemento, el desplazamiento volverá a comenzar desde el
primer elemento.
Página
3
Para tener el control de l alista es preferible guardar ciertos elementos: el primer
elemento, el último elemento, el número de elementos.
Para ello, otra estructura será utilizada (no es obligatorio, pueden ser utilizadas
variables)
Modelo de la función
Esta operación debe ser hecha antes de cualquier otra operación sobre la lista.
Inicializa el puntero inicio y el puntero fin con el puntero NULL, y el tamaño con el
valor 0.
La función:
Página
4
B. Inserción de un elemento en la lista
Modelo de la función:
Etapas:
Página
5
La función:
nuevo_elemento->siguiente = nuevo_elemento;
lista->inicio = nuevo_elemento;
lista->fin = nuevo_elemento;
lista->tamaño++;
return 0;
}
Modelo de la función:
Etapas:
Página
6
La función:
if(actual != lista->fin)
return -1;
nuevo_elemento->siguiente = actual->siguiente;
actual->siguiente = nuevo_elemento;
lista->fin = nuevo_elemento;
lista->tamaño++;
Return 0;
}
Página
7
C. Eliminación de un elemento en la lista
Hacer apuntar el puntero siguiente del elemento actual hacia la dirección del puntero
siguiente del elemento a eliminar
Modelo de la función:
Etapas:
Página
8
La función:
sup_elemento = lista->inicio;
lista->inicio = lista->inicio->siguiente;
lista->fin->siguiente = lista->inicio;
free (sup_elemento->dato);
free (sup_elemento);
lista->tamaño--;
return 0;
}
Modelo de la función:
Página
9
La función devuelve -1 en caso de error, si no devuelve 0.
Etapas:
La función:
sup_elemento = lista->inicio;
lista->inicio = NULL;
lista->fin = NULL;
free (sup_elemento->dato);
Página
10
free (sup_elemento);
lista->tamaño--;
return 0;
}
D. Mostrar la lista
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
recorrida del 1er al ultimo elemento.
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 la lista circular, no hay punto de detención, a menos que elijamos uno.
La función:
/* mostrar la lista */
void mostrar (Lista * lista){
Elemento *actual;
actual = lista->inicio;
int i;
for(i=0;i<lista->tamaño;++i){
printf ("%p - %s\n", actual, actual->dato);
actual = actual->siguiente;
}
}
2. Mostrar la lista sin una condición para detenerse (indefinidamente)
La función:
Página
11
void mostrar_indefinidamente (Lista * lista){
Elemento *actual;
actual = lista->inicio;
while (1){
printf ("%p - %s\n", actual, actual->dato);
actual = actual->siguiente;
}
}
E. Destrucción de la lista
La función:
/* destruir la lista */
void destruir (Lista * lista){
while (lista->tamaño > 0){
if (lista->tamaño > 1)
sup_lista_circ (lista);
else
sup_lista_circ_unica(lista);
}
Página
12
*Ejemplos
Página
13
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MX 100
#include<conio.h>
Item el;
struct NuevoNodo*sig;
}NodoLc;
void VaciaLc(NodoLc**Primero);
//clrscr();
NodoLc *Primero;
GeneraPorElFinalLc(&Primero);
EscribeListaLc(Primero);
getch();
Página
14
}
void VaciaLc(NodoLc**Primero)
*Primero=NULL;
return (Primero==NULL);
NodoLc*NuevoNodoLc(Item x)
NodoLc *nn;
nn=(NodoLc*)malloc(sizeof(NodoLc));
return nn;
NodoLc* nn;
nn=NuevoNodoLc(dato);
if (*Primero!=NULL)
(*Primero) ->sig=nn;
*Primero = nn;
Página
15
void GeneraPorElFinalLc(NodoLc **Primero)
Item d;
NodoLc *p;
p=NULL; randomize();
for (d=random(MX); d; )
InsertaListaCircular (&p,d);
d= random (MX);
*Primero=p;
NodoLc *ptr;
int k=0;
ptr= Primero;
if(ptr!=NULL)
ptr=ptr->sig;
do
k++;
if(k%10==0)
printf("\n");
printf("%d",ptr->el);
Página
16
}
else
printf(" ");
printf("%d",ptr->el);
ptr=ptr->sig;
while (ptr!=Primero->sig);
ptr=*Primero;
if(ptr!=NULL)
if (p==ptr)
*Primero=NULL;
else
ptr->sig=p->sig;
free(p);
NodoLc *ptr,*p;
int enc = 0;
Página
17
ptr = *Primero;
if (ptr==NULL)
return;
while ((ptr->sig!=*Primero)&&(!enc))
enc=(ptr->sig->el==dato);
if (!enc)
ptr = ptr->sig;
if (enc)
{p=ptr->sig;
*Primero=NULL;
else
if (p==*Primero)
*Primero= ptr;
ptr->sig=p->sig;
free(p);
Ejecutado
Página
18
Programa: Búsqueda (lista cir.exe)
Definición:
Programa:
#include <conio.h>
#include <iostream.h>
void main()
int Info[8]={0,10,0,9,5,3,0,20};
int Indice[8]={5,7,6,1,0,3,-999,4};
int Inicio=0,Disp=2,Elemento,Res;
cin>>Elemento;
Res=Busqueda(Info,Indice,Inicio,Disp,Elemento);
if(Res==-999)
cout<<"Dato No Encontrado...";
getch();
int Apuntador=Indice[Inicio];
while(Apuntador!=Inicio)
Página
19
{
if(Elemento==Info[Apuntador])
return Apuntador;
Apuntador=Indice[Apuntador];
return Apuntador;
Definición:
Página
20
Programa:
#include <conio.h>
#include <iostream.h>
void main()
int Info[8]={0,10,0,9,5,3,0,20};
int Indice[8]={5,7,6,1,0,3,-999,4};
int Inicio=0,Disp=2,Elemento,Res;
cout<<"Lista Original\n";
Recorrido(Info,Indice,Inicio,Disp);
cin>>Elemento;
InsPr(Info,Indice,Inicio,Disp,Elemento);
getch();
{int Apuntador=Indice[Inicio];
while(Apuntador!=Inicio)
cout<<Info[Apuntador]<<endl;
Apuntador=Indice[Apuntador];
Página
21
{
if(Disp!=-999)
int Apuntador=Disp;
Disp=Indice[Disp];
Info[Apuntador]=Elemento;
Indice[Apuntador]=Indice[Inicio];
Indice[Inicio]=Apuntador;
Recorrido(Info,Indice,Inicio,Disp);
else
cout<<"Overflow...";
Página
22
*Manual Técnico y de Usuario
*Inserción de un elemento (numero) al Principio
Definición:
Detalle:
Hace una comparación para ver si es posible insertar otro Elemento al arreglo Info, para
esto checa si Disp es Diferente de Nulo. Si no cumple con la condición se desplegar
“Sobre Carga” ya que no se 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
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
Indice[Inicio] y finalmente Indice[Inicio] toma el valor de Apuntador.
Algoritmo:
Apuntador → Disp
Disp → Indice[Disp]
Info[Apuntador] → Elemento
Indice[Apuntador] → Indice[Inicio]
Indice[Inicio] → Apuntador
Salir
Diagrama:
Programa:
Página
23
#include <conio.h>
#include <iostream.h>
void main()
int Info[8]={0,10,0,9,5,3,0,20};
int Indice[8]={5,7,6,1,0,3,-999,4};
int Inicio=0,Disp=2,Elemento,Res;
cout<<"Lista Original\n";
Recorrido(Info,Indice,Inicio,Disp);
cin>>Elemento;
InsPr(Info,Indice,Inicio,Disp,Elemento);
getch();
int Apuntador=Indice[Inicio];
while(Apuntador!=Inicio)
cout<<Info[Apuntador]<<endl;
Apuntador=Indice[Apuntador];
{if(Disp!=-999)
int Apuntador=Disp;
Disp=Indice[Disp];
Página
24
Info[Apuntador]=Elemento;
Indice[Apuntador]=Indice[Inicio];
Indice[Inicio]=Apuntador;
Recorrido(Info,Indice,Inicio,Disp);
else
cout<<"Overflow...";
Programa: Búsqueda
Página
25
Definición:
Detalle:
Algoritmo:
Apuntador → Indice[Inicio]
Imprimir Info[Apuntador]
Regresa Apuntador
Apuntador → Indice[Apuntador]
Regresar Apuntador
Diagrama:
Programa:
#include <conio.h>
Página
26
#include <iostream.h>
void main()
int Info[8]={0,10,0,9,5,3,0,20};
int Indice[8]={5,7,6,1,0,3,-999,4};
int Inicio=0,Disp=2,Elemento,Res;
cin>>Elemento;
Res=Busqueda(Info,Indice,Inicio,Disp,Elemento);
if(Res==-999)
cout<<"Dato No Encontrado...";
getch();
int Apuntador=Indice[Inicio];
while(Apuntador!=Inicio)
{
if(Elemento==Info[Apuntador])
return Apuntador;
Apuntador=Indice[Apuntador];
}
return Apuntador;
Página
27