//Listas doblemente enlazadas
//ITIC. Ana Francisca Martínez Betancourt
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct lista{
char nombre[40];
struct lista *siguiente;
struct lista *anterior;
};
struct lista *primero=NULL, *ultimo=NULL;
int numNodos=0;
int posicion;
//Funciones o Prototipos
void insertarInicio();
void insertarFinal();
void buscar();
void eliminar();
void visualizarInicioFin();
void visualizarFinInicio();
void insertarIntermedio();
void visualizarXfinal();
void visualizarXinicio();
void visualizarPrimerUltimo();
main (){
int opcion;
do{
system("cls");
printf("\n\n\n");
printf("\n****************************************");
printf("\n********Lista doblemente enlazada*******");
printf("\n\n");
printf("\n1. Insertar Datos al Inicio");
printf("\n2. Insertar Datos al Final");
printf("\n3. Insertar Datos en X posición");
printf("\n4. Visualizar Lista de Inicio-Fin");
printf("\n5. Visualizar Lista de Fin-Inicio");
printf("\n6. Visualizar Lista de X dato al Inicio");
printf("\n7. Visualizar Lista de X dato al Final");
printf("\n8. Visualizar Primer y Ultimo Dato");
printf("\n9. Buscar en Lista");
printf("\n10. Eliminar en lista");
printf("\n11. Salir");
printf("\n****************************************");
printf("\n\n");
printf("Ingresar opcion");
scanf("%d", &opcion);
switch(opcion){
case 1: insertarInicio();
break;
case 2:insertarFinal();
break;
case 3: insertarIntermedio();
break;
case 4: visualizarInicioFin();
break;
case 5: visualizarFinInicio();
break;
case 6: visualizarXinicio();
break;
case 7: visualizarXfinal();
break;
case 8: visualizarPrimerUltimo();
break;
case 9: buscar();
break;
case 10: eliminar();
break;
case 11: printf("Salir");
break;
default: system("cls");
break;
}
}
while (opcion !=11);
}
void insertarFinal(){
system("cls");
struct lista *nuevo;
nuevo=(struct lista*)malloc(sizeof(struct lista));
if (nuevo == NULL)
printf("\n Memoria insuficiente");
else{
printf("\n Nombre: ");
fflush(stdin);
gets(nuevo->nombre);
nuevo->siguiente=NULL;
if (primero==NULL){
printf("\nNo hay primer dato");
nuevo->anterior=NULL;
nuevo->siguiente=NULL;
primero=nuevo;
ultimo=nuevo;}
else {
nuevo->siguiente=NULL;
nuevo->anterior=ultimo;
ultimo->siguiente=nuevo;
ultimo=nuevo;
}
}numNodos++;}
void insertarInicio(){
system("cls");
struct lista *nuevo;
nuevo=(struct lista*)malloc(sizeof(struct lista));
if (nuevo == NULL)
printf("\n Memoria insuficiente");
else{
printf("\n Nombre: ");
fflush(stdin);
gets(nuevo->nombre);
nuevo->anterior=NULL;
if(ultimo==NULL){
nuevo->siguiente=NULL;
nuevo->anterior=NULL;
primero=nuevo;
ultimo=nuevo;
}
else{
nuevo->anterior=NULL;
nuevo->siguiente=primero;
primero->anterior=nuevo;
primero=nuevo; }}
numNodos++;
}
void visualizarInicioFin() {
system("cls");
struct lista *actual;
posicion=1;
actual=primero;
while(posicion<=numNodos){
printf(" %d.- ", posicion);
printf("%s\n",actual->nombre);
actual=actual->siguiente;
posicion++;
}
if(numNodos==0)
printf("\nLista vacia");
printf("\n\n\n");
system("pause");
}
void insertarIntermedio (){
system ("cls");
struct lista *actual, *nuevo;
nuevo=( struct lista*)malloc(sizeof( struct lista));
if (nuevo==NULL)
printf("\n MEMORIA INSUFUCIENTE\n");
if (numNodos <2)
printf ("\n Número de nodos insuficiente");
else{
int pos_insertar;
printf("\n Nombre: ");
fflush(stdin);
gets(nuevo->nombre);
printf ("\n Posicion: ");
scanf ("%d", &pos_insertar);
if((pos_insertar >1) &&(pos_insertar <= numNodos)){
actual=primero;
for (posicion = 2; posicion <pos_insertar; ++posicion)
actual= actual->siguiente;
nuevo->siguiente= actual->siguiente;
nuevo->anterior = actual;
actual->siguiente->anterior = nuevo;
actual->siguiente = nuevo;
numNodos++;
}
}
printf("\n\n\n\n\n\n\n");
system("pause");
}
void visualizarFinInicio(){
system("cls");
struct lista *actual;
actual=ultimo;
posicion= numNodos;
while (posicion >0){
printf(" %d.- ", posicion);
printf("%s\n",actual->nombre);
actual =actual->anterior;
posicion--;
}
if(numNodos==0)
printf("\n LISTA VACIA");
printf("\n\n\n\n\n\n\n");
system("pause");
}
void visualizarXfinal(){
system("cls");
int pos;
struct lista *actual;
actual = primero;
printf("\n Indique posicion ");
scanf("%d", &pos);
system("cls");
for (posicion = 2; posicion<=pos; posicion++){
actual = actual->siguiente;
}
while (pos <= numNodos){
printf("%d.-", pos);
printf("%s\n", actual->nombre);
actual = actual->siguiente;
pos++;
}
printf("\n\n\n\n\n\n\n");
system("pause");
}
void visualizarXinicio(){
system("cls");
int pos;
struct lista *actual;
actual = primero;
printf ("\n Indique posicion ");
scanf("%d",&pos);
system ("cls");
for (posicion = 2; posicion <=pos; posicion++){
actual = actual->siguiente;
}
posicion = pos;
while (actual!= NULL){
printf(" %d.- ", posicion);
printf("%s\n", actual->nombre);
actual = actual->anterior;
posicion--;
}
printf("\n\n\n\n\n\n\n");
system("pause");
}
void visualizarPrimerUltimo(){
system("cls");
if(numNodos==0)
printf("\n LISTA VACIA");
else
printf("\n PRIMERO -------> %s", primero->nombre);
printf("\n\n ULTIMO ------>%s", ultimo->nombre);
printf("\n\n\n\n\n\n\n");
system ("pause");
}
void buscar(){
system("cls");
struct lista *actual;
char aux [40];
int p = 1;
int encontrado =0;
actual = primero;
system("cls");
printf("\n Indique nombre a buscar ");
fflush(stdin);
gets(aux);
system("cls");
while (p <= numNodos){
if(strcmp(aux, actual->nombre)==0){
printf("\n %s EXISTE", aux);
encontrado =1;
}
p++;
actual = actual->siguiente;
}
if (encontrado==0)
printf("\n %s NO EXISTE", aux);
printf("\n\n\n\n\n\n\n");
system("pause");
}
void eliminar(){
system("cls");
struct lista *aux;
struct lista *actual;
int nodo_eliminar;
int x;
printf("\n Indique la posicion del nombre a eliminar ");
scanf(" %d", &nodo_eliminar);
if (nodo_eliminar > numNodos || nodo_eliminar < 1)
printf("Elemento inexistente");
if (nodo_eliminar == 1){
aux = primero;
primero = primero->siguiente;
if (primero == NULL)
ultimo = NULL;
else
primero ->anterior == NULL;
}
else if (nodo_eliminar == numNodos){
aux = ultimo;
ultimo->anterior->siguiente = NULL;
ultimo = ultimo->anterior;
}else{
actual = primero;
for (x=1; x<nodo_eliminar; ++x)
actual = actual->siguiente;
aux = actual;
actual->anterior->siguiente = actual->siguiente;
actual->siguiente->anterior = actual->anterior;
}
free(aux);
numNodos--;
}
No hay comentarios:
Publicar un comentario