viernes, 23 de septiembre de 2016

Código para listas doblemente enlazadas

//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