Advertisement
lukhavi

PilaConListaEnlazada

Nov 8th, 2019
528
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.26 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h> // malloc()
  3.  
  4. // Implementacion Pila infinita con listas enlazadas simples de valores enteros
  5. // Dos opciones:
  6. // 1.- Pop() obtiene el valor y destruye el nodo.
  7. // 2.- Pop() obtiene el valor pero no destruye el nodo, al finalizar destruimos la Pila completa.
  8. // Utilizamos opcion 1.-
  9.  
  10. typedef struct Nodo{
  11.     int data;
  12.     struct Nodo *sig;
  13. }Nodo;
  14. //Nodo *sp = NULL;  // puntero de pila a cada Nodo
  15.  
  16. void Push(Nodo **sp,int valor);     // modificamos el puntero de Pila, Apila
  17. int Pop(Nodo **sp);                 // modificamos el puntero de Pila, Desapila
  18. void freeNodoStack(Nodo ***sp);     // Metodo solo utilizable desde Pop() para liberar el nodo
  19. int ShowStack(Nodo *sp);            // no necesitamos modificar el puntero sp, Muestra Pila y retorna el numero de nodos de la Pila
  20. void DestroyStack(Nodo **sp);      
  21. int isEmpty(Nodo *sp);
  22. int nNodos(void);
  23. // eraseNodo(Nodo *sp, int valor);
  24. //searchNodo(Nodo *sp, int valor);
  25. //maxNodo(Nodo *sp);
  26. //minNodo(Nodo *sp);
  27. //avergePila(Nodo *sp);
  28. //
  29.  
  30. static int numNodos;                // variable global que entrega el numero datos en la pila
  31.  
  32. int main(void){
  33.    
  34.     Nodo *sp_nodo = NULL;                   //  apunta al actual nodo de la pila, i.e. no hay nada aun
  35.    
  36.     printf("###########################################\n\n");
  37.     printf("<<<Apilamos algunos valores en la Pila>>>\n\n");
  38.     Push(&sp_nodo,1);                       // apilamos
  39.     Push(&sp_nodo,2);
  40.     Push(&sp_nodo,3);
  41.     Push(&sp_nodo,4);
  42.     Push(&sp_nodo,5);
  43.     Push(&sp_nodo,6);
  44.     Push(&sp_nodo,7);
  45.     Push(&sp_nodo,8);
  46.     Push(&sp_nodo,9);
  47.     Push(&sp_nodo,10);
  48.     Push(&sp_nodo,11);
  49.     printf("###########################################\n\n");
  50.    
  51.     printf("<<<Mostramos la pila creada>>>\n\n");
  52.     ShowStack(sp_nodo);                     // Mostramos toda la pila
  53.     printf("\n###########################################\n");
  54.     printf("\n<<<Desapilamos algunos valore de la Pila>>>\n\n");
  55.     printf("\t\t|%d|\n",Pop(&sp_nodo));     // Desapilamos
  56.     printf("\t\t|%d|\n",Pop(&sp_nodo));
  57.     printf("\t\t|%d|\n",Pop(&sp_nodo));
  58.     printf("\t\t|%d|\n",Pop(&sp_nodo));
  59.     printf("\t\t|%d|\n",Pop(&sp_nodo));
  60.     printf("\t\t|%d|\n",Pop(&sp_nodo));
  61.     printf("\t\t|%d|\n",Pop(&sp_nodo));
  62.     printf("\n###########################################\n\n");
  63.     //Push(&sp_nodo,55);                    // apilamos un nuevo valor
  64.     //printf("%d\n",Pop(&sp_nodo));
  65.     printf("<<<Mostramos la pila que ha quedado>>>\n\n");
  66.     ShowStack(sp_nodo);                     // Mostramos nueva Pila
  67.     printf("\n###########################################\n");
  68.     printf("Cantidad de nodos de la Pila: %d\n",nNodos());
  69.     printf("<<<Operacion de Destruir Pila>>>\n");
  70.     DestroyStack(&sp_nodo);
  71.     printf("Cantidad de nodos de la Pila: %d\n",nNodos());
  72.     ShowStack(sp_nodo);
  73.     DestroyStack(&sp_nodo);
  74.    
  75.    
  76.     printf("\n<<<Fin>>>\n");
  77.     return 0;
  78.    
  79. }
  80. //+---------------------------------------------------------------------------------+
  81. void Push(Nodo **sp,int valor){
  82.    
  83.     Nodo * nuevo = (Nodo *)malloc(sizeof(Nodo));
  84.     numNodos++;
  85.     if(*sp==NULL){              // si pila vacia
  86.         *sp =  nuevo;           // *sp es puntero que apunta al nuevo nodo de la pila
  87.         nuevo->data = valor;
  88.         nuevo->sig =NULL;
  89.     }
  90.     else{
  91.         nuevo->sig = *sp;  
  92.         *sp = nuevo;
  93.         nuevo->data = valor;
  94.     }              
  95. }
  96. //+---------------------------------------------------------------------------------+
  97. int Pop(Nodo **sp){
  98.     int pop = -1;
  99.     Nodo *aux;
  100.     if(*sp == NULL)
  101.         printf("Error: Pila vacia, Pop no se puede ejecutar.-\n");
  102.     else{
  103.         pop = (*sp)->data;      // obtiene dato
  104.         aux = (*sp)->sig;       // puntero a nodo por debajo de tope
  105.         free(*sp);
  106.         //freeNodoStack(&sp);   // liberamos lo apuntado por puntero(*sp) del tope
  107.         *sp = aux;              // puntero de pila apunta al nodo que queda de nuevo tope
  108.         numNodos--;
  109.     }
  110.     return pop;
  111. }
  112. //+---------------------------------------------------------------------------------+
  113. // sp es puntero que apunta a un puntero a puntero (triple puntero)
  114. // *sp es el puntero a puntero  (doble puntero)
  115. // **sp es el puntero
  116. void freeNodoStack(Nodo ***sp){
  117.     if((**sp)!=NULL)
  118.         free(**sp);
  119.     else
  120.         printf("Error: La pila esta vacia, no puede liberar ningun nodo\n");
  121. }
  122. //+---------------------------------------------------------------------------------+
  123. int ShowStack(Nodo *sp){
  124.     int primero = 1;
  125.     int numnodos =0;
  126.     Nodo *sp_aux = sp;
  127.     if(sp_aux!=NULL){
  128.         printf("Tope de Pila--> |");
  129.         while(sp_aux!=NULL){
  130.             if(!primero)
  131.                 printf("\t\t|");
  132.             else primero--;
  133.             printf("%d|\n",sp_aux->data);
  134.             sp_aux = sp_aux->sig;
  135.             numnodos++;
  136.         }
  137.     //printf("Base de Pila:\n");   
  138.     }
  139.     else printf("Error: Pila vacia, no es posible mostrar la Pila.-\n");
  140.    
  141.     return numnodos;
  142.     //printf("\n");
  143. }
  144. //+---------------------------------------------------------------------------------+
  145.  
  146. void DestroyStack(Nodo **sp){
  147.    
  148. Nodo *sp_aux = NULL;        // copiamos el puntero de pila
  149.    
  150.     if(!isEmpty(*sp)){
  151.         while(*sp!=NULL){
  152.             sp_aux = (*sp)->sig;
  153.             free(*sp);
  154.             *sp = sp_aux;
  155.         }
  156.     printf("Pila Destruida\n");
  157.     numNodos = 0;
  158.     }
  159.     else
  160.         printf("Error: Para destruir primero debe crear una Pila.-\n");
  161. }
  162. //+----------------------------------------------------------------------------------+
  163. int isEmpty(Nodo *sp){return sp !=NULL?0:1;}
  164. //+----------------------------------------------------------------------------------+
  165. int nNodos(void){return numNodos;}
  166. //+----------------------------------------------------------------------------------+
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement