implementacion de programas lista circular y circular doble

7
LISTA CIRCULAR: Este programa tiene como finalidad apuntar al siguiente nodo consecutivamente hasta llegar al final y de ahí apuntar al primer nodo en vez de al NULL para asi poder hacer una lista circular, esta lista no es muy diferente al de la lista simple ya que solo se apunta a la primera dirección en vez de al NULL para poder volverse circular, que dando en el programa las direcciones consecutivas y la del principio al final. En este programa usted podrá ver las direcciones de los datos que usted guarde para poder ver este proceso primero tiene que ingresar número de ahí solo tendrá que ir a la opción imprimir para poder ver las direcciones. Al igual podrá eliminar un número para que vea cómo cambia la dirección de memoria. #include<stdio.h> #include<stdlib.h> typedef int Item; typedef struct Elemento { Item dato; struct Elemento* siguiente; }Nodo; Nodo* crearNodo(Item x); void insertaCircular(Nodo** lc, Item entrada); void eliminar(Nodo** lc, Item entrada); void imprimirLista(Nodo *lc); main() { Nodo* Listac = NULL; int op; int dato; int pos; do{ printf("\n\t\tLISTA CIRCULAR SIMPLE\n\n"); printf("1. Insertar \n"); printf("2. Eliminar\n"); printf("3. Imprimir lista\n"); printf("4. Salir\n");

Upload: mack-granadillo-rodriguez

Post on 07-Feb-2016

212 views

Category:

Documents


0 download

DESCRIPTION

Este programa tiene como finalidad apuntar al siguiente nodo consecutivamente hasta llegar al final y de ahí apuntar al primer nodo en vez.

TRANSCRIPT

Page 1: Implementacion de Programas Lista Circular y Circular Doble

LISTA CIRCULAR:

Este programa tiene como finalidad apuntar al siguiente nodo consecutivamente hasta llegar al final y de ahí apuntar al primer nodo en vez de al NULL para asi poder hacer una lista circular, esta lista no es muy diferente al de la lista simple ya que solo se apunta a la primera dirección en vez de al NULL para poder volverse circular, que dando en el programa las direcciones consecutivas y la del principio al final. En este programa usted podrá ver las direcciones de los datos que usted guarde para poder ver este proceso primero tiene que ingresar número de ahí solo tendrá que ir a la opción imprimir para poder ver las direcciones. Al igual podrá eliminar un número para que vea cómo cambia la dirección de memoria.

#include<stdio.h>#include<stdlib.h>

typedef int Item;typedef struct Elemento{

Item dato;struct Elemento* siguiente;

}Nodo;Nodo* crearNodo(Item x);void insertaCircular(Nodo** lc, Item entrada);void eliminar(Nodo** lc, Item entrada);void imprimirLista(Nodo *lc);

main(){

Nodo* Listac = NULL;int op;int dato;int pos;do{

printf("\n\t\tLISTA CIRCULAR SIMPLE\n\n");printf("1. Insertar \n");printf("2. Eliminar\n");printf("3. Imprimir lista\n");printf("4. Salir\n");

printf("\n\t Ingrese una opcion: ");scanf("%d", &op);

switch(op){system("cls");case 1:

system("cls");printf("Numero a insertar: ");scanf("%d", &dato);insertaCircular(&Listac, dato);

Page 2: Implementacion de Programas Lista Circular y Circular Doble

break;

case 2:system("cls");printf("Valor a eliminar: ");scanf("%d", &dato);

eliminar(&Listac, dato);break;

case 3:system("cls");printf("\n\n Mostrando lista\n\n");

imprimirLista(Listac);break;

}system("pause"); system("cls");

}while(op!=4);

system("pause"); return 1;}

Nodo* crearNodo(Item x){ Nodo *a; a = (Nodo*)malloc(sizeof(Nodo)); a -> dato = x; a -> siguiente = a; return a; }

void insertaCircular(Nodo** lc, Item entrada){

Nodo* nuevo;

nuevo = crearNodo(entrada);if(*lc !=NULL){

nuevo -> siguiente = (*lc) -> siguiente;(*lc) -> siguiente = nuevo;

}*lc = nuevo;

}void eliminar(Nodo** lc, Item entrada){

Nodo* actual;int encontrado = 0;

Page 3: Implementacion de Programas Lista Circular y Circular Doble

if ((*lc) == NULL) return;

actual = *lc;

while ((actual -> siguiente != *lc) && (!encontrado)){

encontrado = (actual -> siguiente -> dato == entrada);if(!encontrado){

actual = actual -> siguiente;}

}encontrado = (actual -> siguiente -> dato == entrada);

if (encontrado){

Nodo* p;p = actual -> siguiente;if(*lc == (*lc) ->siguiente)

*lc = NULL;else{

if(p == *lc){

*lc = actual;} actual -> siguiente = p -> siguiente;

}free(p);

}}void imprimirLista(Nodo *lc){

Nodo* aux; aux = lc;

if(lc !=NULL) do{

printf ("\n%x->[ %d ]%x]\n\n",aux, aux->dato, aux->siguiente); aux = aux -> siguiente;

} while(aux != lc);

}

Page 4: Implementacion de Programas Lista Circular y Circular Doble

LISTA CIRCULAR DOBLE:

Este programa muestra la lista de direcciones de los números ingresados por el usuario. Mostrando las direcciones del siguiente, del anterior y la del principio la cual queda apuntado en vez del nodo NULL, siendo una lista doble circular ya que muestra cada una de las direcciones de los datos ingresados. En este programa solo podrán realizar inserción de datos, impresión y eliminación, los cuales son más que suficientes para poder ver la finalidad del programa.

#include<stdio.h>#include<stdlib.h>

typedef int Item;typedef struct Elemento{

Item dato; struct Elemento* siguiente;struct Elemento* anterior;

}Nodo;Nodo* crearNodo(Item x);void insertaCircular(Nodo** lc, Item entrada);void eliminar(Nodo** lc, Item entrada);void imprimirLista(Nodo *lc);

main(){

Nodo* Listac = NULL;int op;int dato;int pos;do{

printf("\n\t\tLISTA CIRCULAR DOBLE \n\n");printf("1. Insertar circular\n");printf("2. Eliminar\n");printf("3. Imprimir lista\n");printf("4. Salir\n");

printf("\n\t Ingrese una opcion: ");scanf("%d", &op);

switch(op){system("cls");case 1:

system("cls");printf("Numero a insertar: ");scanf("%d", &dato);insertaCircular(&Listac, dato);

break;

Page 5: Implementacion de Programas Lista Circular y Circular Doble

case 2:system("cls");printf("Valor a eliminar: ");scanf("%d", &dato);

eliminar(&Listac, dato);break;

case 3:system("cls");printf("\n\n Mostrando lista\n\n");

imprimirLista(Listac);break;

}system("pause"); system("cls");

}while(op!=4);

system("pause"); return 1;}Nodo* crearNodo(Item x){ Nodo *a; a = (Nodo*)malloc(sizeof(Nodo)); a -> dato = x; a -> siguiente = a; a -> anterior = a; return a;}void insertaCircular(Nodo** lc, Item entrada){

Nodo* nuevo;

nuevo = crearNodo(entrada);if(*lc !=NULL){

nuevo -> siguiente = *lc;nuevo -> anterior = (*lc) -> anterior;(*lc) -> anterior -> siguiente = nuevo;(*lc) -> anterior = nuevo;

}*lc = nuevo;

}void eliminar(Nodo** lc, Item entrada){

Nodo* actual;int encontrado = 0;if ((*lc) == NULL) return;

Page 6: Implementacion de Programas Lista Circular y Circular Doble

actual = *lc;

while ((actual -> siguiente != *lc) && (!encontrado)){

encontrado = (actual -> siguiente -> dato == entrada);if(!encontrado){

actual = actual -> siguiente;}

}encontrado = (actual -> siguiente -> dato == entrada);

if (encontrado){

Nodo* p;p = actual -> siguiente;if(*lc == (*lc) ->siguiente)

*lc = NULL;else{

if(p == *lc){

*lc = actual;} actual -> siguiente = p -> siguiente;

}free(p);

}}void imprimirLista(Nodo *lc){

Nodo* aux; aux = lc;

if(lc !=NULL) do{

printf ("\n%x->[%x[ %d ]%x]\n\n",aux, aux->anterior, aux->dato, aux->siguiente); aux = aux -> siguiente;

} while(aux != lc);

}