sábado, 23 de enero de 2016

LISTA CIRCULAR

Código:

El siguiente cogido, lee la lista, luego la muestra, borra  los valores 10000 y -3500, luego presenta la lista, y después agrega los valores 2500, 25000 y -500, despues muestra la lista de nuevo, pero en este caso se puede ver claramente donde se insertaron los datos ya que quedan justo entre el que era el ultimo valor y el primero.

// Lista circular en C++
// (C) Agosto 2001, Salvador Pozo
// C con Clase: http://c.conclase.net

#include <iostream>
using namespace std;

#define ASCENDENTE 1
#define DESCENDENTE 0

class nodo {
   public:
    nodo(int v, nodo *sig = NULL)
    {
       valor = v;
       siguiente = sig;
    }

   private:
    int valor;
    nodo *siguiente;
     
   friend class lista;
};

typedef nodo *pnodo;

class lista {
   public:
    lista() { actual = NULL; }
    ~lista();
 
    void Insertar(int v);
    void Borrar(int v);
    bool ListaVacia() { return actual == NULL; }
    void Mostrar();
    void Siguiente();
    bool Actual() { return actual != NULL; }
    int ValorActual() { return actual->valor; }
 
   private:
    pnodo actual;
};

lista::~lista()
{
   pnodo nodo;

   // Mientras la lista tenga más de un nodo
   while(actual->siguiente != actual) {
      // Borrar el nodo siguiente al apuntado por lista
      nodo = actual->siguiente;
      actual->siguiente = nodo->siguiente;
      delete nodo;
   }
   // Y borrar el último nodo
   delete actual;
   actual = NULL;
}

void lista::Insertar(int v)
{
   pnodo Nodo;

   // Creamos un nodo para el nuevo valor a insertar
   Nodo = new nodo(v);

   // Si la lista está vacía, la lista será el nuevo nodo
   // Si no lo está, insertamos el nuevo nodo a continuación del apuntado
   // por lista
   if(actual == NULL) actual = Nodo;
   else Nodo->siguiente = actual->siguiente;
   // En cualquier caso, cerramos la lista circular
   actual->siguiente = Nodo;
}

void lista::Borrar(int v)
{
   pnodo nodo;

   nodo = actual;

   // Hacer que lista apunte al nodo anterior al de valor v
   do {
      if(actual->siguiente->valor != v) actual = actual->siguiente;
   } while(actual->siguiente->valor != v && actual != nodo);
   // Si existe un nodo con el valor v:
   if(actual->siguiente->valor == v) {
      // Y si la lista sólo tiene un nodo
      if(actual == actual->siguiente) {
         // Borrar toda la lista
         delete actual;
         actual = NULL;
      }
      else {
         // Si la lista tiene más de un nodo, borrar el nodo  de valor v
         nodo = actual->siguiente;
         actual->siguiente = nodo->siguiente;
         delete nodo;
      }
   }
}

void lista::Mostrar()
{
   pnodo nodo = actual;

   do {
      cout << nodo->valor << "-> ";
      nodo = nodo->siguiente;
   } while(nodo != actual);

   cout << endl;
}

void lista::Siguiente()
{
   if(actual) actual = actual->siguiente;
}

int main()
{
   lista Lista;

   Lista.Insertar(500);
   Lista.Insertar(1000);
   Lista.Insertar(-4000);
   Lista.Insertar(3000);
   Lista.Insertar(5000);
   Lista.Insertar(10000);
   Lista.Insertar(4000);
   Lista.Insertar(-3500);
   Lista.Insertar(4500);
   Lista.Insertar(2000);

   Lista.Mostrar();

   cout<<"\n";
   cout << "Lista de elementos:" << endl;
   Lista.Borrar(10000);
   Lista.Borrar(-3500);

   Lista.Mostrar();
   cout<<"\n";
   cout << "Lista de elementos:" << endl;

   Lista.Insertar(2500);
   Lista.Insertar(25000);
   Lista.Insertar(-500);

   Lista.Mostrar();
   cout<<"\n";

   cin.get();
   return 0;
}



LISTA DOBLE ENLAZADA


Código:

El siguiente código lee una lista, la organiza ascendente mente y descendente mente, la muestra, luego elimina los valores 10000, 5000, 4500 y -4000, de nuevo ordena la lista y la presenta de forma ascendente y descendente.

Por ultimo inserta el valor 9000 y de nuevo ordena la lista y la presenta ascendente y descendente mente y la muestra

// Cola doblemente enlazada en C++
// (C) Septiembre 2001, Salvador Pozo
// C con Clase: http://c.conclase.net

#include <iostream>
using namespace std;

#define ASCENDENTE 1
#define DESCENDENTE 0

class nodo {
   public:
    nodo(int v, nodo *sig = NULL, nodo *ant = NULL) :
       valor(v), siguiente(sig), anterior(ant) {}

   private:
    int valor;
    nodo *siguiente;
    nodo *anterior;
        
   friend class lista;
};

typedef nodo *pnodo;

class lista {
   public:
    lista() : plista(NULL) {}
    ~lista();
    
    void Insertar(int v);
    void Borrar(int v);
    bool ListaVacia() { return plista == NULL; } 
    void Mostrar(int);
    void Siguiente();
    void Anterior();
    void Primero();
    void Ultimo();
    bool Actual() { return plista != NULL; }
    int ValorActual() { return plista->valor; }
    
   private:
    pnodo plista;
};

lista::~lista()
{
   pnodo aux;
   
   Primero();
   while(plista) {
      aux = plista;
      plista = plista->siguiente;
      delete aux;
   }
}

void lista::Insertar(int v)
{
   pnodo nuevo;
   Primero();
   // Si la lista está vacía
   if(ListaVacia() || plista->valor > v) {
      // Asignamos a lista un nuevo nodo de valor v y
      // cuyo siguiente elemento es la lista actual                    
      nuevo = new nodo(v, plista);
      if(!plista) plista = nuevo;
      else plista->anterior = nuevo;
   }
   else {
      // Buscar el nodo de valor menor a v 
      // Avanzamos hasta el último elemento o hasta que el siguiente tenga 
      // un valor mayor que v 
      while(plista->siguiente && plista->siguiente->valor <= v) Siguiente();
      // Creamos un nuevo nodo después del nodo actual
      nuevo = new nodo(v, plista->siguiente, plista);
      plista->siguiente = nuevo;
      if(nuevo->siguiente) nuevo->siguiente->anterior = nuevo;
   }
}

void lista::Borrar(int v)
{
   pnodo nodo;
   
   nodo = plista;
   while(nodo && nodo->valor < v) nodo = nodo->siguiente;
   while(nodo && nodo->valor > v) nodo = nodo->anterior;

   if(!nodo || nodo->valor != v) return;
   // Borrar el nodo 
   
   if(nodo->anterior) // no es el primer elemento 
      nodo->anterior->siguiente = nodo->siguiente;
   if(nodo->siguiente) // no el el último nodo
      nodo->siguiente->anterior = nodo->anterior;
   delete nodo;
}

void lista::Mostrar(int orden)
{
   pnodo nodo;
   if(orden == ASCENDENTE) {
      Primero();
      nodo = plista;
      while(nodo) {
         cout << nodo->valor << "-> ";
         nodo = nodo->siguiente;
      }
   }
   else {
      Ultimo();
      nodo = plista;
      while(nodo) {
         cout << nodo->valor << "-> ";
         nodo = nodo->anterior;
      }
   }
   cout << endl;
}

void lista::Siguiente()
{
   if(plista) plista = plista->siguiente;
}

void lista::Anterior()
{
   if(plista) plista = plista->anterior;
}

void lista::Primero()
{
   while(plista && plista->anterior) plista = plista->anterior;
}

void lista::Ultimo()
{
   while(plista && plista->siguiente) plista = plista->siguiente;
}

int main()
{
   lista Lista;
   
   Lista.Insertar(500);
   Lista.Insertar(1000);
   Lista.Insertar(-4000);
   Lista.Insertar(3000);
   Lista.Insertar(5000);
   Lista.Insertar(10000);
   Lista.Insertar(4000);
   Lista.Insertar(-3500);
   Lista.Insertar(4500);
   Lista.Insertar(2000);

   Lista.Mostrar(ASCENDENTE);
   Lista.Mostrar(DESCENDENTE);
   cout<<"\n";

   Lista.Primero();
   cout << "Primero: " << Lista.ValorActual() << endl;
   
   Lista.Ultimo();
   cout << "Ultimo: " << Lista.ValorActual() << endl;
   cout<<"\n";
   
   Lista.Borrar(10000);
   Lista.Borrar(5000);
   Lista.Borrar(4500);
   Lista.Borrar(-4000);
   
   Lista.Mostrar(ASCENDENTE);
   Lista.Mostrar(DESCENDENTE);
   
   cout<<"\n";
   Lista.Insertar (9000);
   Lista.Mostrar(ASCENDENTE);
   Lista.Mostrar(DESCENDENTE);

   cin.get();
   return 0;
}






EJEMPLO DE LISTAS SIMPLE

Este código muestra una lista que lee los datos, los ordena y luego muestra cual es el primero y el ultimo, después, muestra la lista ya ordenada.


Código:

// Lista en C++
// (C) Abril 2001, Salvador Pozo
// C con Clase: http://c.conclase.net

#include <iostream>
using namespace std;

class nodo {
   public:
    nodo(int v, nodo *sig = NULL)
    {
       valor = v;
       siguiente = sig;
    }

   private:
    int valor;
    nodo *siguiente;
        
   friend class lista;
};

typedef nodo *pnodo;

class lista {
   public:
    lista() { primero = actual = NULL; }
    ~lista();
    
    void Insertar(int v);
    void Borrar(int v);
    bool ListaVacia() { return primero == NULL; } 
    void Mostrar();
    void Siguiente();
    void Primero();
    void Ultimo();
    bool Actual() { return actual != NULL; }
    int ValorActual() { return actual->valor; }
    
   private:
    pnodo primero;
    pnodo actual;
};

lista::~lista()
{
   pnodo aux;
   
   while(primero) {
      aux = primero;
      primero = primero->siguiente;
      delete aux;
   }
   actual = NULL;
}

void lista::Insertar(int v)
{
   pnodo anterior;

   // Si la lista está vacía
   if(ListaVacia() || primero->valor > v) {
      // Asignamos a lista un nievo nodo de valor v y
      // cuyo siguiente elemento es la lista actual                    
      primero = new nodo(v, primero);
   }
   else {
      // Buscar el nodo de valor menor a v 
      anterior = primero;
      // Avanzamos hasta el último elemento o hasta que el siguiente tenga 
      // un valor mayor que v 
      while(anterior->siguiente && anterior->siguiente->valor <= v) 
         anterior = anterior->siguiente;
      // Creamos un nuevo nodo después del nodo anterior, y cuyo siguiente
      // es el siguiente del anterior
      anterior->siguiente = new nodo(v, anterior->siguiente);
   }
}

void lista::Borrar(int v)
{
   pnodo anterior, nodo;
   
   nodo = primero;
   anterior = NULL;
   while(nodo && nodo->valor < v) {
      anterior = nodo; 
      nodo = nodo->siguiente;
   }
   if(!nodo || nodo->valor != v) return;
   else { // Borrar el nodo 
      if(!anterior) // Primer elemento 
         primero = nodo->siguiente;
      else  // un elemento cualquiera
         anterior->siguiente = nodo->siguiente;
      delete nodo;
   }   
}

void lista::Mostrar()
{
   nodo *aux;
   
   aux = primero;
   while(aux) {
      cout << aux->valor << "-> ";
      aux = aux->siguiente;
   }
   cout << endl;
}

void lista::Siguiente()
{
   if(actual) actual = actual->siguiente;
}

void lista::Primero()
{
   actual = primero;
}

void lista::Ultimo()
{
   actual = primero;  
   if(!ListaVacia()) 
      while(actual->siguiente) Siguiente();
}

int main()
{
   lista Lista;
   
   Lista.Insertar(500);
   Lista.Insertar(1000);
   Lista.Insertar(-4000);
   Lista.Insertar(3000);
   Lista.Insertar(5000);
   Lista.Insertar(10000);
   Lista.Insertar(4000);
   Lista.Insertar(-3500);
   Lista.Insertar(4500);
   Lista.Insertar(2000);
   
   
   Lista.Mostrar();

   cout << "Lista de elementos:" << endl;
   Lista.Primero();
   while(Lista.Actual()) {
      cout << Lista.ValorActual() << endl;
      Lista.Siguiente();
   }
   Lista.Primero();
   cout << "Primero: " << Lista.ValorActual() << endl;
   
   Lista.Ultimo();
   cout << "Ultimo: " << Lista.ValorActual() << endl;
   
   Lista.Insertar(500);
   Lista.Insertar(1000);
   Lista.Insertar(-4000);
   Lista.Insertar(3000);
   Lista.Insertar(5000);
   Lista.Insertar(10000);
   Lista.Insertar(4000);
   Lista.Insertar(-3500);
   Lista.Insertar(4500);
   Lista.Insertar(2000);
   
   Lista.Mostrar();

   cin.get();
   return 0;
}




LISTAS

CUADRO COMPARATIVO



sábado, 16 de enero de 2016

Ejemplos

Suma de dos vectores.


En esta Imagen se puede observar un código fuente en el que se pide el ingreso del tamaño de dos vectores por teclado y luego se solicita que se ingresen los valores de cada uno de los vectores. El programa retorna la suma de los valores de cada vector.


Varias Operaciones Aritméticas usando Vectores

código fuente:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
# include <conio.h>
#include<iostream>
using namespace std;

int main()
{
    int tam=0;
    int suma;
    int produ;
    int rest;
    int div;
    int x;
    cout<<"ingrese el tamaño de los dos vectores que usaremos"<<endl;
    cin>>tam;
    int a[tam];
    int b[tam];
    int c[tam];
    cout<< "ingrese los valores del vector a"<<endl;
            for (int i=0; i<tam; i++)
                {
                cin>>a[i];
                }
    cout<<"ingrese los valores del vector b"<<endl;
            for (int i=0; i<tam; i++)
                {
                cin>>b[i];
                }
    cout<<"seleccione la opcion que desea"<<endl;
    cout<<"1. Suma"<<endl;
    cout<<"2. Resta"<<endl;
    cout<<"3. Multiplicacion"<<endl;
    cout<<"4. Division"<<endl;
    cin>>x;
           switch(x)
           {
                    case 1:  cout<<"la suma de los vectores es="<<endl;
                             for (int i=0; i<tam; i++)
                             {
                             c[i]= a[i]+b[i];
                             cout<<c[i]<<endl;
                             }break;
                    case 2:  cout<<"la resta de los vectores es="<<endl;
                             for (int i=0; i<tam; i++)
                             {
                             c[i]= a[i]-b[i];
                             cout<<c[i]<<endl;
                             }break;
                    case 3:  cout<<"la multiplicacion de los vectores es="<<endl;
                             for (int i=0; i<tam; i++)
                             {
                             c[i]= a[i]*b[i];
                             cout<<c[i]<<endl;
                             }break;
                    case 4:  cout<<"la division de los vectores es="<<endl;
                             for (int i=0; i<tam; i++)
                             {
                             c[i]= a[i]/b[i];
                             cout<<c[i]<<endl;
                             }break;
           }
                 
system("pause");
return 0;
}

El código anterior permite ingresar por teclado el tamaño de  dos vectores, luego solicita el ingreso de cada uno de sus valores, y posteriormente permite seleccionar que operación aritmética se desea hacer,(suma, resta, multiplicación o división)




Matrices:

Suma de dos matrices


en la imagen se ve un ejemplo de un programa que permite ingresar los datos de dos matrices y luego las suma:


#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
# include <conio.h>
#include<iostream> 
using namespace std;


int main() 
{

int fila,columna;
int B[10][10];
int A[10][10];
int C[10][10];


cout << "Ingrese la cantidad de Filas: " ;
cin >> fila; 
cout << "Ingrese la cantidad de Columna: " ;
cin >> columna; 


A[1][1]=A[fila][columna]; 


cout << "\nLa nueva matriz es de " << fila << "x" << columna << "\n\n";


for(int i=0;i<fila;i++)
        { 
        for(int n=0;n<columna;n++)
                {
                cout << "Ingrese el valor de [" << i+1 << "][" << n+1 << "] : " ;
                cin >> A[i][n];
                } 
        } 


cout << "\nLa matriz A es \n\n"; 

for(int i = 0; i < fila; i++)
        {
        for(int n = 0; n < columna; n++)
                { 
                cout << A[i][n]; 
                }    
        cout << endl; 
        } 
cout<<"ingrese los valores de la segunda matriz"<<endl;

for(int i=0;i<fila;i++)
        { 
        for(int n=0;n<columna;n++)
                {
                cout << "Ingrese el valor de [" << i+1 << "][" << n+1 << "] : " ;
                cin >> B[i][n];
                } 
        } 

cout << "\nLa matriz B es \n\n"; 

for(int i = 0; i < fila; i++)
        {
        for(int n = 0; n < columna; n++)
                { 
                cout << B[i][n]; 
                }    
        cout << endl; 
        } 

for( int i=0;i<fila;i++)
{
    for(int n=0;n<columna;n++)
{
            C[i][n]=A[i][n]+B[i][n];
      }
  }
cout<<"la suma de matrices es"<<endl;
for( int i=0;i<fila;i++)
  {
    for(int n=0;n<columna;n++)
{
             cout<<C[i][n];
      }
      cout<<endl;
}
cout<<endl;
system("pause<nul"); 
return 0;
}



TRANSPUESTA

Este ejemplo muestra un programa que carga los datos de una matriz y la transpone:


#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
# include <conio.h>
#include<iostream> 
using namespace std;


int main() 
{

int fila,columna;
int matriz[10][10];
int transpuesta [10][10];

 
cout << "Ingrese la cantidad de Filas: " ;
cin >> fila; 
cout << "Ingrese la cantidad de Columna: " ;
cin >> columna; 


matriz[1][1]=matriz[fila][columna]; 


cout << "\nLa nueva matriz es de " << fila << "x" << columna << "\n\n";

 
for(int i=0;i<fila;i++)
        { 
        for(int n=0;n<columna;n++)
                {
                cout << "Ingrese el valor de [" << i+1 << "][" << n+1 << "] : " ;
                cin >> matriz[i][n];
                } 
        } 


cout << "\nLa matriz guardada es \n\n"; 

for(int i = 0; i < fila; i++)
        {
        for(int n = 0; n < columna; n++)
                { 
                cout << matriz[i][n]; 
                transpuesta[n][i]=matriz[i][n];
                }    
        cout << endl; 
        } 

cout << "\nLa matriz transpuesta es \n\n"; 
for(int n = 0; n < columna; n++)
        {
        for(int i = 0; i < fila; i++)
                { 
                cout << transpuesta[n][i]; 
                }    
        cout << endl; 
        } 


system("pause<nul"); 
return 0;
}