Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

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

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!