Listas en C con recursividad

listas.h:

/* header para el manejo de listas....
desarrollado por kellerman rivero krsloco@gmail.com
bajo licencia creative commons, 

el manejo de listas, realizando algoritmos convencionales
y algoritmos recursivos

UNELTCA 2010 Prog II

*/

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

typedef struct lista_simple {
      int info;    
      struct lista_simple *sig;
} lista;

lista *inicializar_lista(){
  return NULL;
}

lista *solicitar_nodo (){
  return ((lista *)malloc(sizeof(lista)));
}

lista *insertar_inicio (lista *inicio, int valor){
    lista *q;
    if((q = solicitar_nodo())!=NULL){
      q -> info = valor;
      q -> sig = inicio;
      inicio = q;
    } else printf("Memoria no Disponible \n");
    return inicio;
}

lista *eliminar_inicio (lista *inicio){
    if (inicio != NULL){
      lista *q;
      q = inicio;
      inicio = inicio->sig;
      free(q);
      return inicio;
    } else return NULL;
}

lista *insertar_final (lista *inicio, int valor){
   if (inicio != NULL){
     lista *q,*w; w = inicio;
     while ( w->sig != NULL)
       w = w->sig;
     if((q = solicitar_nodo())!=NULL){
      q -> info = valor;
      q -> sig = NULL;
      w -> sig = q;
     } else printf("Memoria no Disponible \n");
     return inicio;
   } else {
    inicio = insertar_inicio(inicio,valor);
    return inicio;
   }
}

lista *eliminar_final (lista *inicio){
  if (inicio != NULL){
    lista *q, *w; q = inicio, w = inicio;
    while (w->sig != NULL){
      q = w;
      w = w -> sig;
    }
    q -> sig = NULL;
    free(w);
    return inicio;
  } else return NULL;
}

void imprimir_lista (lista *inicio){
  if (inicio != NULL){
    int n=1;
    printf("Nodo[%d] - Valor: %d\n",n,inicio->info);
    while (inicio->sig != NULL){
      n++;
      inicio = inicio -> sig;
      printf("Nodo[%d] - Valor: %d\n",n,inicio->info);
    }
  } else {
    printf("Lista Vacia \n");
  }
}

lista *eliminar_final_r (lista *inicio){ 
  if(inicio != NULL){
    if  (inicio->sig != NULL) {
    lista *q;
    q = eliminar_final_r(inicio->sig);
    inicio->sig = q;
    } else {
      free(inicio);
      return NULL;
    }
  } else return NULL;
}

lista *insertar_final_r(lista *inicio, int valor){ 
  if(inicio != NULL){
    lista *q;
     if(inicio -> sig == NULL){
       if((q = solicitar_nodo())!=NULL){
  q -> info = valor;
  q -> sig = NULL;
  inicio->sig = q;
       } else {
  printf("Memoria no Disponible \n");
  return NULL;
       }
     } else {
       q = insertar_final_r(inicio->sig,valor);
       inicio->sig = q;
     }
  } else {
     return insertar_inicio(inicio,valor);
  }
}

main.c:
/* Programa para el manejo de listas....
desarrollado por kellerman rivero krsloco@gmail.com
bajo licencia creative commons, 

el manejo de listas, realizando algoritmos convencionales
y algoritmos recursivos

UNELTCA 2010 Prog II

*/

#include  <stdio.h>
#include  <stdlib.h>
#include  "listas.h"
#define for_x for(x=0; x<N; x++)

int main(){
  lista *P;
  int N,valor,x;
  P = inicializar_lista();
  printf("Introduzca la cantidad de nodos: ");
  scanf("%d",&N);
  for_x{
   system("cls");
   printf("Introduzca el valor para el nodo[%d]: ",x+1);
   scanf("%d",&valor);
   P = insertar_inicio(P,valor);
  }
  imprimir_lista(P);
  P = eliminar_inicio(P);
  P = eliminar_final_r(P);
  getch();
  system("cls");
  imprimir_lista(P);
  
  return 0;
}

0 comentarios:

Publicar un comentario

Seguidores

Estadisticas