Listas enlazadas (Eliminar nodos segun condicion de sus datos).

Iniciado por santycarp17, 6 Octubre 2017, 00:39 AM

0 Miembros y 2 Visitantes están viendo este tema.

santycarp17

hola, estoy aprendiendo c++ y tengo una duda sobre un problema que me plantearon el cual debe borrar aquellos nodos los cuales tengan un campo (en este caso es el inventario o stock) de un articulo sean iguales a 0 (si no hay stock borrar el nodo). necesitaria una orientacion. dejare el codigo para ver si me pueden ayudar. Gracias


/*
* File:   main.cpp
* Author: Santy
*
* Created on 4 de octubre de 2017, 3:38
*/
/*
* Generar una lista con la nómina de artículos de un supermercado. De cada artículo se conoce: código,
descripción, precio y stock. La carga finaliza con el código -1. Se solicita:
A. Leer de teclado un porcentaje e incrementar el precio de todos los artículos en esa cantidad.
B. Incrementar el stock de un artículo. Se lee de teclado el código y la cantidad con la que se debe
incrementar el stock. Si no existe el artículo en la lista se debe informar.
C. Eliminar de la lista los artículos que no tienen stock.

*/

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <string.h>
#define nullptr NULL
using namespace std;
void ingreso();
void porcentaje();
void muestra();
void cambio();
void borrar();
void restastock();

struct Articulo{
    int Cod;
    float Precio;
    char Descripcion[50];
    int Inventario;
    struct Articulo *sig;
    }*inicial=NULL, *fin=NULL, *anterior=NULL,*auxiliar=NULL;
   

int Codigo;

   

int main() {
    int opc;
    do{
        system("cls");
        cout<<"EJERCICIO 22."<<endl;
        cout<<"MENU DE OPCIONES"<<endl;
        cout<<"1. Carga de productos"<<endl;
        cout<<"2. Incremento de los precios (en porcentaje)"<<endl;
        cout<<"3. Muestra de productos"<<endl;
        cout<<"4. Incremento de Inventario"<<endl;
        cout<<"5. Restar Inventario"<<endl;
        cout<<"6. Borrar articulos con stock 0"<<endl;
        cout<<"Para salir ingrese '-1'"<<endl<<endl;
        cout<<"Ingrese la opcion: ";
        cin>>opc;
        switch(opc){
            case 1:  ingreso();
            break;
            case 2: porcentaje();
            break;
            case 3: muestra();
            break;
            case 4: cambio();
            break;
            case 5: restastock();
            break;
            case 6: borrar();
            break;
            case -1: break;
           
            default: cout<<"La opcion no es correcta"<<endl;
        }
        system ("pause");
        }while (opc!=-1);

return EXIT_SUCCESS;
}

/*deficion de la funcion ingreso*/
void ingreso(){
    auxiliar= new Articulo;
    system("cls");
    if (auxiliar){
        cout<<"INGRESE ARTICULOS A LA LISTA"<<endl<<endl;
        cout<<"Escriba el codigo del producto: ";
        cin>>auxiliar->Cod;
        cout<<"Escriba el precio del producto: ";
        cin>>auxiliar->Precio;
        cout<<"Escriba la descripcion del producto: ";
        fflush(stdin);
        cin>>(auxiliar->Descripcion);
        cout<<"Escriba el stock del producto: ";
        cin>>(auxiliar->Inventario);   
        auxiliar->sig=nullptr;
        if (inicial==nullptr){
            inicial=auxiliar;
            fin=auxiliar;
        }
        else {
            fin->sig=auxiliar;
            fin=auxiliar;
           
        }
       
        }
    else {
            cout<<"error en la memoria"<<endl;
}
}
void porcentaje(){
   system("cls");
    int por;
    float tot;
    tot=0;
    if (inicial==nullptr){
        cout <<"No hay productos";
    }else{
       cout <<"Ingrese porcentaje: ";
    cin >> por;
        auxiliar=inicial;
        while (auxiliar!=nullptr){
            tot=(auxiliar->Precio*por)/100;
            auxiliar->Precio=(auxiliar->Precio+tot);
            auxiliar=auxiliar->sig;
        }
       
    }
   
}
void muestra(){
   system("cls");
    if (inicial==NULL){
        cout <<"No hay productos.";
    }else{
        auxiliar=inicial;
        while (auxiliar!=NULL){
            cout<<"Codigo de producto= "<<auxiliar->Cod<<endl;
            cout<<"Precio de producto= "<<auxiliar->Precio<<endl;
            cout<<"Descripcion de producto= "<<auxiliar->Descripcion<<endl;
            cout<<"Stock de producto= "<<auxiliar->Inventario<<endl;
            cout<<endl;
            auxiliar=auxiliar->sig;
        }
       
    }
   
}

void cambio(){
   system("cls");
   
   int invn;
   invn=0;
   if (inicial==NULL){
       cout<<"No hay productos.";
       return;
   }
   else{
         cout<<"Ingrese el codigo del producto";
         cin>>(Codigo);
       auxiliar=inicial;
       while (auxiliar!=NULL){
           if (Codigo==auxiliar->Cod){
               cout<<"Ingrese la cantidad de inventario a incrementar: ";
               cin>>invn;
               auxiliar->Inventario=auxiliar->Inventario+invn;
               return;
           }
           auxiliar=auxiliar->sig;
       }
       cout<<"Codigo de producto no encontrado."<<endl;
       return;
             
   }
   
   
}
void restastock(){
   system("cls");
   
   int invn;
   invn=0;
   if (inicial==NULL){
       cout<<"No hay productos."<<endl;
       return;
   }
   else{
         cout<<"Ingrese el codigo del producto";
         cin>>(Codigo);
        auxiliar=inicial;
        while (auxiliar!=NULL){
           if (Codigo==auxiliar->Cod){
               cout<<"Ingrese la cantidad de inventario a borrar: ";
               cin>>invn;
               auxiliar->Inventario=auxiliar->Inventario-invn;
               return;
           }
           auxiliar=auxiliar->sig;
       }
       cout<<"Codigo de producto no encontrado."<<endl;
       return;
             
   }
   
   
}
void borrar(){
   system("cls");
    auxiliar=inicial;
    while (auxiliar!=nullptr){
        if (auxiliar->Inventario!=0){
            anterior=auxiliar;
            auxiliar=auxiliar->sig;
        }
        else{
            if (auxiliar=inicial){//fijarse!!!!!!!!!!!!!!
                inicial=inicial->sig;
            }
            else if(auxiliar->sig==nullptr){
                anterior->sig==nullptr;
                fin=anterior;
                }
                else{
                anterior->sig=auxiliar->sig;
                }
           
            delete auxiliar;
            cout<<"Producto borrado exitosamente."<<endl;
        }
           
        auxiliar=auxiliar->sig;
    }
    cout<<"No Hay ningun producto para eliminar"<<endl;
}



Serapis

#1
En general cuando vas borrando un elemento al 'RestarStock', siempre después de ello, podrías revisar si el stock llegó a 0 y en ese caso eliminar el artículo sin necesidad de crear una función exprofeso (o al menos que evitar que tenga que invocarse desde fuera).


Buleano = Funcion RestarStock
   Articulo nodo
    Entero codigo

   Si (NumItems > 0 ) luego  //siempre verificamos primero la existencia de elementos.
       codigo = PedirCodigoDeProductoAEliminar
       nodo = BuscarArticulo(codigo) //esto sería una función con un bucle para
           //recorrer la lista buscando el código (si no guarda un orden conocido).
       Si (nodo noesnulo) luego
           nodo.Inventario -=1
           Si (nodo.Inventario = 0) luego
               Llamada a BorrarArticulo(nodo)  
           Fin si    
           Devolver True      
       Sino
           Mensaje "no existe ningún artículo con ese código."    
           Devolver False
       Fin si
   Sino
       Mensaje "No quedan artículos."
       Devolver False
   Fin si
Fin funcion



// La función debería ser privada, invocada exclusivamente desde 'RestarStock'.
//    que es quien comprueba que no queda stock del artículo...
Funcion BorrarArticulo(Articulo nodo)
   // atamos los nodos adhiacentes al nodo entre sí.
   // Al tiempo quedan eliminadas las referencias que sus extremos tienen con él.
   Si (nodo noesprimero) luego
       nodo.anterior.Siguiente = Nodo.siguiente
   Fin si
   Si nodo noesultimo) luego
       nodo.siguiente.anterior = Nodo.Anterior
   Fin si

   //Desatamos el nodo a eliminar de sus extremos (eliminamos las referencias que este nodo tiene a otros)
   nodo.anterior = nulo
   nodo.siguiente = nulo

   // eliminamos el propio nodo
   nodo = nulo

   // descontamos un artículo de la lista.
   NumItems -=1

   // quizás interese avisar cuando ya no queden artículos (Si numItems = 0 .... )
Fin funcion


santycarp17

hola, muchas gracias por responder, entendi esa forma y tambien otra que es mediante un bool.


bool borrar(){
if (inicial != nullptr){
Articulo* auxiliar = inicial;
if (inicial->Inventario == 0){
inicial = inicial->sig;
delete auxiliar;
return true; //Se eliminó el elemento (estaba al principio)
}
else{
while (auxiliar->sig != nullptr && auxiliar->sig->Inventario != 0)
auxiliar = auxiliar->sig;
if (auxiliar->sig == nullptr)
return false; //No se encontró el elemento
else{
if (auxiliar->sig->Inventario == 0){
Articulo* aEliminar = auxiliar->sig;
auxiliar->sig = auxiliar->sig->sig;
delete aEliminar;
return cout<<"Articulo borrado."<<endl; //Se eliminó el elemento (no estaba al principio)
}
}
}
}
else
    cout << "Nada que eliminar."<<endl<<endl; //La lista está vacía

la verdad ese apunte me ayuda mucho para entender y comprenderlo mejor, gracias