Ir ao conteúdo
  • Cadastre-se
Mauro Del Gaudio

Problema com remoção de item na lista - c++

Recommended Posts

Boa noite galera!

Esse algoritmo cria uma lista 'prato' e cada 'prato' tem outra lista 'ingredientes'.

 

Na hora de inserir ta certinho, quando eu removo um prato ele remove certo também, mas quando vou adicionar um outro prato, depois de ter removido

ele para de funcionar na hora que pede o ingrediente, o que pode ser isso?

 

-----------------------------lista.h----------------------------------

#include<iostream>
#include<string>
using namespace std;
typedef struct ingredientes
{
    int codIng;
    string nomeIng;
    struct ingredientes *pProxIng;
    
}Tingredientes;
typedef struct
{
    Tingredientes *pPrimeiroIng,*pUltimoIng;
}Ti;
typedef struct prato
{
    string nomePrato;
    int codPrato;
    Ti *ingredientes;
    struct prato *pProxPrato;
}Tprato;
typedef struct
{
    Tprato *pPrimeiroPrato,*pUltimoPrato;
    
}Tp;
void TLista_Inicia(Tp *pLista);
int TLista_EhVazia(Tp *pLista);
int TLista_Insere(Tp *pLista,int cod,string nomep);
int TLista_InsereIngrediente(Tp *pLista,int codPrato,string nome,int cod2);
Tprato* TLista_RetiraPrato(Tp *pLista,int codPrato);
int TLista_Imprime(Tp *pLista);


---------------------------------lista.cpp----------------------------------------------
#include<iostream>
#include<string>
#include"lista.h"
using namespace std;
void TLista_Inicia(Tp *pLista)
{
    
    pLista->pPrimeiroPrato=new Tprato;    
    pLista->pUltimoPrato=pLista->pPrimeiroPrato;    
    pLista->pPrimeiroPrato->pProxPrato=NULL;    
    ///////////////////////////////////////////////////////////////////////////////////
    pLista->pPrimeiroPrato->ingredientes=new Ti;    
    pLista->pPrimeiroPrato->ingredientes->pPrimeiroIng=new Tingredientes;
    pLista->pPrimeiroPrato->ingredientes->pUltimoIng=pLista->pPrimeiroPrato->ingredientes->pPrimeiroIng;    
    pLista->pPrimeiroPrato->ingredientes->pPrimeiroIng->pProxIng=NULL;
    
    
}
int TLista_EhVazia(Tp *pLista)
{
    if(pLista->pPrimeiroPrato==pLista->pUltimoPrato)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int TLista_Insere(Tp *pLista,int cod,string nomep)
{
    pLista->pUltimoPrato->pProxPrato=new Tprato;
    pLista->pUltimoPrato=pLista->pUltimoPrato->pProxPrato;
    pLista->pUltimoPrato->codPrato=cod;
    pLista->pUltimoPrato->nomePrato=nomep;
    pLista->pUltimoPrato->ingredientes=new Ti;
    pLista->pUltimoPrato->ingredientes->pPrimeiroIng=new Tingredientes;
    pLista->pUltimoPrato->ingredientes->pUltimoIng=pLista->pUltimoPrato->ingredientes->pPrimeiroIng;
    pLista->pUltimoPrato->ingredientes->pUltimoIng->pProxIng=NULL;
    pLista->pUltimoPrato->pProxPrato=NULL;
    return 1;
}
int TLista_InsereIngrediente(Tp *pLista,int codPrato,string nome,int cod2)
{
    Tprato *aux=new Tprato;
    aux=pLista->pPrimeiroPrato;
    while(aux->pProxPrato->codPrato!=codPrato)
    {
        aux=aux->pProxPrato;
    }
    aux=aux->pProxPrato;
    aux->ingredientes->pUltimoIng->pProxIng=new Tingredientes;
    aux->ingredientes->pUltimoIng->pProxIng->nomeIng=nome;
    aux->ingredientes->pUltimoIng->pProxIng->codIng=cod2;
    aux->ingredientes->pUltimoIng->pProxIng->pProxIng=NULL;
    aux->ingredientes->pUltimoIng=aux->ingredientes->pUltimoIng->pProxIng;
    
}
int TLista_Imprime(Tp *pLista)
{
    if(TLista_EhVazia(pLista))
    {
        cout<<"Lista vazia!\n\n"<<endl;
        return 0;
    }
    
    Tprato *tmp;
    Tingredientes *tmp2;
    tmp = pLista->pPrimeiroPrato->pProxPrato;
    while(tmp!=NULL)
    {
        cout<<"---------------------"<<endl;
        cout<<"Codigo do prato: "<<tmp->codPrato<<endl;
        cout<<"Nome do prato: "<<tmp->nomePrato<<endl;
        cout<<"Ingredientes"<<endl;
        cout<<"|   Cod   |   Nome   "<<endl;
        tmp2 = tmp->ingredientes->pPrimeiroIng->pProxIng;
        while(tmp2!=NULL)
        {
            cout<<"    "<<tmp2->codIng;
            cout<<"      "<<tmp2->nomeIng<<endl;
            tmp2=tmp2->pProxIng;
        }
        tmp=tmp->pProxPrato;
    }
    cout<<"---------------------"<<endl;
}
Tprato* TLista_RetiraPrato(Tp *pLista,int codPrato)
{
    Tprato *aux=new Tprato;
    Tprato *aux2=new Tprato;
    aux=pLista->pPrimeiroPrato;
    aux2=pLista->pPrimeiroPrato->pProxPrato;
    while(aux->pProxPrato->codPrato!=codPrato)
    {
        aux=aux->pProxPrato;
    }
    aux=aux->pProxPrato;
    while(aux->ingredientes->pPrimeiroIng->pProxIng!=NULL)
    {
        delete aux->ingredientes->pPrimeiroIng->pProxIng;
        aux->ingredientes->pPrimeiroIng=aux->ingredientes->pPrimeiroIng->pProxIng;
    }
    while(aux->pProxPrato!=NULL)
    {
        if(aux->codPrato==codPrato)
        {
            break;
        }
        else
        {
            aux=aux2;
            aux=aux->pProxPrato;
        }
    }
    aux2->pProxPrato=aux->pProxPrato;
    delete aux;
}

----------------------------------main.cpp-------------------------------------
#include<iostream>
#include"lista.h"
#include<string>
using namespace std;
int main()
{
    Tp *pLista=new Tp;
    int codPrato,codIng;
    string NomeIng,NomePrato;
    int resp;
    int op;
    do
    {
        
        cout<<"1-Fazer lista"<<endl;
        cout<<"2-Verificar se a lista esta vazia"<<endl;
        cout<<"3-Inserir prato com ingredientes na lista"<<endl;
        cout<<"4-Retirar prato e ingredientes da lista"<<endl;
        cout<<"5-Imprimir"<<endl;
        cout<<"7-Sair"<<endl;
        cin>>op;
        switch(op)
        {
            case 1:
                TLista_Inicia(pLista);
                break;
            case 2:
                if(TLista_EhVazia(pLista))
                {
                    cout<<"Lista vazia"<<endl;
                }
                else
                {
                    cout<<"Lista contem itens"<<endl;
                }
                break;
    
                
            case 3:
                cout<<"Digite o codigo do prato"<<endl;
                cin>>codPrato;
                cout<<"Digite o nome do prato"<<endl;
                fflush(stdin);
                getline(cin,NomePrato);
                TLista_Insere(pLista,codPrato,NomePrato);
                resp=1;
                while(resp==1)
                {
                    cout<<"Digite o codigo do ingrediente"<<endl;
                    cin>>codIng;
                    cout<<"Digite o nome do ingrediente que deseja adicionar"<<endl;
                    fflush(stdin);
                    getline(cin,NomeIng);
                    TLista_InsereIngrediente(pLista,codPrato,NomeIng,codIng);
                    cout<<"Deseja adicionar mais um ingrediente? 1-sim 0-nao"<<endl;
                    cin>>resp;
                }
                fflush(stdin);
                break;
            case 4:
                cout<<endl;
                cout<<"Digite o codigo do prato a ser apagado"<<endl;
                cin>>codPrato;
                TLista_RetiraPrato(pLista,codPrato);
                cout<<"Item removido da lista"<<endl;
                break;
            case 5:
                cout<<endl;
                TLista_Imprime(pLista);
                break;
            case 7:
                break;
            default:
                cout<<"Valor inválido"<<endl;
                break;
        }
    }while(op!=7);
    //cout<<pLista->pUltimo->prato->ingredientes.nome<<"<<<<<<<<<<"<<endl;
    //cout<<pLista->pPrimeiroPrato->ingredientes->pPrimeiroIng->in
    while(pLista->pPrimeiroPrato->ingredientes->pPrimeiroIng->pProxIng!=NULL)
    {
        delete pLista->pPrimeiroPrato->ingredientes;
        pLista->pPrimeiroPrato->ingredientes->pPrimeiroIng=pLista->pPrimeiroPrato->ingredientes->pPrimeiroIng->pProxIng;
    }
    while(pLista->pPrimeiroPrato->pProxPrato!=NULL)
    {
        delete pLista->pPrimeiroPrato;
        pLista->pPrimeiroPrato=pLista->pPrimeiroPrato->pProxPrato;
    }
    return 0;
}

 

Editado por dif
Postar o código com o botão CODE

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×