martes, 27 de septiembre de 2016

Código para listas circulares simplemente enlazadas

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct listacir{
 char nombre[40];
 struct listacir *siguiente;
};
struct listacir *primero=NULL, *ultimo=NULL;
int numNodos;
int pos;
void insertarUltimo ();
void insertarInicio ();
void insertarIntermedio ();
void visualizar();
void visualizarDesdePosicion();
void visualizarPrimeroUltimo();
void buscar();
void eliminar();
main(){
 int opcion;
 do{
  system("cls");
  printf("\n\n\n");
  printf("\n************************");
  printf("\n 1. Insertar Ultimo");
  printf("\n 2. Insertar Primero");
  printf("\n 3. Insertar en X posicion");
  printf("\n 4. Visualizar");
  printf("\n 5. Visualizar desde X posicion");
  printf("\n 6. Visualizar Primero y Ultimo");
  printf("\n 7. Buscar");
  printf("\n 8. Eliminar");
  printf("\n 9. Salir");
  printf("\n****************************");
  printf("\n\n\n");
  printf("\nElija una opcion  ");
  scanf("%d", &opcion);
  switch (opcion){
   case 1: insertarUltimo();
   break;
   case 2: insertarInicio();
   break;
   case 3: insertarIntermedio();
   break;
   case 4: visualizar();
   break;
   case 5: visualizarDesdePosicion();
   break;
   case 6: visualizarPrimeroUltimo();
   break;
   case 7: buscar();
   break;
   case 8: eliminar();
   break;
   case 9: printf("SALIR, GRACIAS POR ESTAR EN EL SISTEMA");
   break;
   default: system("cls");
   break;
  }
 }while (opcion!= 9);
}
void insertarUltimo(){
 system("cls");
 struct listacir *nuevo;
 nuevo=(struct listacir*)malloc(sizeof(struct listacir));
 if(nuevo==NULL)
 printf("\n Memoria insuficiente\n");
 else{
  printf("\n Nombre: ");
  fflush(stdin);
  gets(nuevo->nombre);
  nuevo->siguiente=primero;
  if(primero==NULL)
  {
   primero=nuevo;
   ultimo=nuevo;
  }else{
   ultimo->siguiente=nuevo;
   ultimo=nuevo;
  }
 }numNodos++;

}
void insertarInicio(){
 system("cls");
 struct listacir *nuevo;
 nuevo=(struct listacir*)malloc(sizeof(struct listacir));
 if(nuevo==NULL)
 printf("Memoria insuficiente\n");
 else{
  printf("\n Nombre: ");
  fflush(stdin);
  gets(nuevo->nombre);
  ultimo->siguiente = nuevo;
  nuevo->siguiente= primero;
  primero= nuevo;
  numNodos++;
 }
}
void insertarIntermedio(){
 system("cls");
 struct listacir *actual;
 struct listacir *nuevo;
 nuevo=(struct listacir*)malloc(sizeof(struct listacir));
 if (nuevo==NULL)
 printf("\nMemoria insuficiente");
 if(numNodos < 2)
 printf(" \n Numero de nodos insuficiente");
 else{
  int pos_insertar;
  printf("\n Nombre: ");
  fflush(stdin);
  gets(nuevo->nombre);
  printf("\nPosicion: ");
  scanf("%d", &pos_insertar);
  if((pos_insertar >1)&&(pos_insertar <= numNodos)){
 actual=primero;
 for(pos =2; pos <pos_insertar; ++pos)
 actual=actual->siguiente;
 nuevo->siguiente=actual->siguiente;
 actual->siguiente = nuevo;
 numNodos++;
 } }
 system("pause");
}
void visualizar(){
 system("cls");
 struct listacir *aux;
 pos=0;
 aux=primero;
 while(pos< numNodos){
  printf("%d.- ", pos+1);
  printf(" %s\n", aux->nombre);
  aux= aux->siguiente;
  pos++;
 }
 if(numNodos==0)
 printf("\nLista vacia");
 printf("\n\n\n\n\n");
 system("pause");
}
void visualizarPrimeroUltimo(){
 system("cls");
 if(numNodos==0)
 printf("\nLista vacia");
 else
 printf("\n Primero ------> %s", primero->nombre);
 printf("\n Ultimo--------_>%s", ultimo->nombre);
 printf("\n\n\n\n");
 system("pause");
 }
void visualizarDesdePosicion(){
 system("cls");
 int p=1;
 int posicion;
 struct listacir *actual;
 actual = primero;
  printf("\n Indique posicion  ");
  scanf("%d", &posicion);
  system("cls");
  for (pos = 2; pos <=posicion; pos++)
  {
   actual = actual->siguiente;
 }
 while (p <= numNodos)
  {
  printf("%s\n", actual->nombre);
  actual = actual->siguiente;
  p++;
  }
 printf("\n\n\n\n");
 system("pause");
}
void buscar() {
 system("cls");
 struct listacir *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 listacir *aux;
 struct listacir *anterior;
 pos=1;
 int nodo_eliminar;
 aux = primero;
 printf("\n Indique la posicion del nombre a eliminar ");
 scanf("%d", &nodo_eliminar);
 if(nodo_eliminar>numNodos || nodo_eliminar <1)
 printf("Elemento inexistente");
 else{
  if(nodo_eliminar==1)
  {
   aux=primero;
   primero = primero ->siguiente;
   free(aux);
   numNodos--;
  }
  else if(nodo_eliminar == numNodos)
  {
   while(pos<numNodos){
    if(pos==numNodos-1)
    anterior=aux;
    pos++;
    aux=aux->siguiente;
   
   }
if(pos==0)
printf("Lista vacia\n");
anterior->siguiente=primero;
ultimo=anterior;
free(aux);
numNodos--;  
 
  }
  else{
   while(pos<=numNodos){
   if(pos == nodo_eliminar-1)
   anterior=aux;
   if(pos == nodo_eliminar)
   free(aux);
   if(pos== nodo_eliminar + 1)
   anterior->siguiente=aux;
   pos++;
   aux = aux->siguiente;
  }
  numNodos--;
 }
 printf("\n\n\n\n\n");
 system("pause");
}
}

No hay comentarios:

Publicar un comentario