Stack and queue in a linked list

1

I have done an exercise in which I enter data in a stack and in a queue, I sort the data from least to greatest and I visualize them in a linked list, the code I have works, but I think that something can be changed to improve it .

Code:

typedef struct nodo{
   int dato;
   struct nodo *siguiente;
}Nodo;

Nodo *principioPila = NULL;
Nodo *primeroCola = NULL;
Nodo *ultimoCola = NULL;

//Prototipos de funciones

void meterPila();
void llenarCola();
int introducirDatos();
void ordenarDatos();
void visualizarDatos();

int main()
{
   printf("Ejercicio Examen\n\n");

   printf("Datos para la pila\n");
   meterPila();
   printf("\nDatos para la cola\n");
   llenarCola();
   ordenarDatos();
   printf("\nLista enlazada ordenada\n");
   visualizarDatos();

   return 0;
}

void meterPila()
{
   Nodo *nuevo;
   int numero = introducirDatos();

   while(numero!=0)
   {
      nuevo = (Nodo*)malloc(sizeof(Nodo));
      nuevo->dato=numero;
      nuevo->siguiente=principioPila;
      principioPila=nuevo;
      numero=introducirDatos();
   }
}

 void llenarCola()
{
    Nodo *nuevo;
    int numero=introducirDatos();

    while(numero!=0)
    {
      nuevo = (Nodo*)malloc(sizeof(Nodo));
      nuevo->dato=numero;

      if(ultimoCola==NULL)
      {
          nuevo->siguiente=NULL;
          primeroCola=nuevo;
          ultimoCola=nuevo;
      }
      else
      {
          nuevo->siguiente=NULL;
          ultimoCola->siguiente=nuevo;
          ultimoCola=nuevo;
      }     
      numero=introducirDatos();
   }
}


int introducirDatos()
{
   int x;
   printf("Numero: ");
   scanf("%d",&x);
   return x;
}

void ordenarDatos()
{
   Nodo *pivote,*actual;
   int temp;

   //Ordenar Pila
   pivote=principioPila;
   while(pivote!=NULL)
   {
       actual=pivote;
       while(actual!=NULL)
       {
           if(pivote->dato > actual->dato)
           {
              temp=pivote->dato;
              pivote->dato=actual->dato;
              actual->dato=temp;
           }
           actual=actual->siguiente;
         }
         pivote=pivote->siguiente;
     }

    //Ordenar Cola
    pivote=primeroCola;
    while(pivote!=NULL)
    {
      actual=pivote;
      while(actual!=NULL)
      {
          if(pivote->dato > actual->dato)
          {
            temp=pivote->dato;
            pivote->dato=actual->dato;
            actual->dato=temp;
          }
          actual=actual->siguiente;
       }
       pivote=pivote->siguiente;
    }
 }

 void visualizarDatos()
 {
   Nodo *lista;

    lista=principioPila;    
    while(lista!=NULL)
    {
      printf("Dato: %d\n",lista->dato);
      lista=lista->siguiente;
    }   

    lista=primeroCola;
    while(lista!=NULL)
    {
      printf("Dato: %d\n",lista->dato);
      lista=lista->siguiente;
    }   
  }
    
asked by Mario Guiber 16.08.2017 в 09:31
source

1 answer

1

Well, in the end I managed to put the data of a stack and a queue in the linked list and I have been ordering the data. I leave the code for you to see and thus help those who need it. Thanks anyway:)

Code:

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

typedef struct nodo{
    int dato;
    struct nodo *siguiente;
}Nodo;

Nodo *principioPila = NULL;
Nodo *primeroCola = NULL;
Nodo *ultimoCola = NULL;
Nodo *lista = NULL;

//Prototipos de funciones

void meterPila();
void llenarCola();
int introducirDatos();
void ListaEnlazadaOrdenada();
void visualizarDatos();

int main()
{
    printf("Ejercicio\n\n");

    printf("Datos para la pila\n");
    meterPila();
    printf("\n\nDatos para la cola\n");
    llenarCola();
    ListaEnlazadaOrdenada();
    printf("\n\nLista enlazada ordenada\n");
    visualizarDatos();

    return 0;
}

void meterPila()
{
    Nodo *nuevo;
    int numero = introducirDatos();

    while(numero!=0)
    {
        nuevo = (Nodo*)malloc(sizeof(Nodo));
        nuevo->dato=numero;
        nuevo->siguiente=principioPila;
        principioPila=nuevo;
        numero=introducirDatos();
    }
}

void llenarCola()
{
    Nodo *nuevo;
    int numero=introducirDatos();

    while(numero!=0)
    {
        nuevo = (Nodo*)malloc(sizeof(Nodo));
        nuevo->dato=numero;

        if(ultimoCola==NULL)
        {
            nuevo->siguiente=NULL;
            primeroCola=nuevo;
            ultimoCola=nuevo;
        }
        else
        {
            nuevo->siguiente=NULL;
            ultimoCola->siguiente=nuevo;
            ultimoCola=nuevo;
        }       
        numero=introducirDatos();
    }
}

int introducirDatos()
{
    int x;
    printf("Numero: ");
    scanf("%d",&x);
    return x;
}

void ListaEnlazadaOrdenada()
{
    Nodo *pila,*cola,*pivote,*auxiliar,*anterior;
    int valor;

    //Pila en la lista enlazada
    pila=principioPila;
    while(pila!=NULL)
    {   
        valor=pila->dato;
        pivote = (Nodo*)malloc(sizeof(Nodo));
        pivote->dato=valor;
        if(lista==NULL)
        {
            pivote->siguiente=lista;
            lista=pivote;
        }
        else
        {
            auxiliar=lista;
            if(pivote->dato < auxiliar->dato)
            {
                pivote->siguiente=auxiliar;
                lista=pivote;
            }
            else
            {
                while(auxiliar!=NULL && pivote->dato > auxiliar->dato)
                {
                    anterior=auxiliar;
                    auxiliar=auxiliar->siguiente;
                }
                if(auxiliar!=NULL)
                {
                    anterior->siguiente=pivote;
                    pivote->siguiente=auxiliar;
                }
                else
                {
                    anterior->siguiente=pivote;
                    pivote->siguiente=NULL;
                }
            }
        }
        pila=pila->siguiente;
    }

    //Cola en la lista enlazada
    cola=primeroCola;
    while(cola!=NULL)
    {
        valor=cola->dato;
        pivote = (Nodo*)malloc(sizeof(Nodo));
        pivote->dato=valor;
        if(lista==NULL)
        {
            pivote->siguiente=lista;
            lista=pivote;
        }
        else
        {
            auxiliar=lista;
            if(pivote->dato < auxiliar->dato)
            {
                pivote->siguiente=auxiliar;
                lista=pivote;
            }
            else
            {
                while(auxiliar!=NULL && pivote->dato > auxiliar->dato)
                {
                    anterior=auxiliar;
                    auxiliar=auxiliar->siguiente;
                }
                if(auxiliar!=NULL)
                {
                    anterior->siguiente=pivote;
                    pivote->siguiente=auxiliar;
                }
                else
                {
                    anterior->siguiente=pivote;
                    pivote->siguiente=NULL;
                }
            }
        }
        cola=cola->siguiente;
    }   
}

void visualizarDatos()
{   
    while(lista!=NULL)
    {
        printf(" %d",lista->dato);
        lista=lista->siguiente;
    }       
}
    
answered by 17.08.2017 / 07:48
source