elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Listas enlazadas (Eliminar nodos segun condicion de sus datos).
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Listas enlazadas (Eliminar nodos segun condicion de sus datos).  (Leído 3,097 veces)
santycarp17

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Listas enlazadas (Eliminar nodos segun condicion de sus datos).
« en: 6 Octubre 2017, 00:39 am »

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;
}




En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.351


Ver Perfil
Re: Listas enlazadas (Eliminar nodos segun condicion de sus datos).
« Respuesta #1 en: 6 Octubre 2017, 04:23 am »

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).

Código:
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

Código:
// 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


« Última modificación: 6 Octubre 2017, 04:35 am por NEBIRE » En línea

santycarp17

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Listas enlazadas (Eliminar nodos segun condicion de sus datos).
« Respuesta #2 en: 9 Octubre 2017, 00:38 am »

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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Listas enlazadas en c++
Programación C/C++
N3r0 3 8,545 Último mensaje 13 Julio 2010, 12:42 pm
por N3r0
Listas enlazadas, nodos y pilas en C++
Programación C/C++
Raxis 2 17,697 Último mensaje 2 Mayo 2011, 22:15 pm
por Raxis
Estructura de datos. Listas simplemente enlazadas-Flavio josefo
Java
carepapa 0 7,727 Último mensaje 8 Septiembre 2011, 05:16 am
por carepapa
[C] Listas enlazadas.
Programación C/C++
The Swash 5 31,600 Último mensaje 26 Octubre 2011, 04:56 am
por brians444
¿Cómo cargar datos desde un archivo .txt en listas ligadas/enlazadas?
Programación C/C++
Juancho25 7 14,218 Último mensaje 1 Mayo 2013, 23:00 pm
por Juancho25
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines