Ir ao conteúdo
  • Cadastre-se

C++ Meu código esta dando um erro


luckyiers

Posts recomendados

#include <iostream>
#include <new>
#include <string>
#include <stdlib.h>

using namespace std;

//Struct para album
struct album{
    string nome;
    int ano;
    struct album *proximo;
};

//Limpa a tela
void limpatela(){
    system("CLS");
}

//Conta quantos elementos tem na lista
int retornaTamanhoListaEncadeada(album *ponteiroEncadeada){

   //Tamanho da lista
   int tamanho = 0;

   //Ponteiro para percorrer a lista
   album *p = ponteiroEncadeada;

   while(p != NULL){

       //Transforma o P no endereco do proximo valor, Caso o endereco seja NULL, estamos no fim da lista
        p = p->proximo;

        //Contador de tamanho da lista
        tamanho++;
   }

   return tamanho;

}

//Imprime a lista encadeada
void imprimeEncadeada(album *ponteiroEncadeada) {

   //Ponteiro auxiliar para percorrer a lista
   album *p = ponteiroEncadeada;

   //Mostra a posicao do elemento
   int posicao = 0;

   //Enquanto o p nao for nulo
   while(p != NULL){

        //Imprime o valor da lista
        cout << posicao << " - " << p->nome << ", " << p->ano << "\n";

        //Transforma o P no endereco do proximo valor, Caso o endereco seja NULL, estamos no fim da lista
        p = p->proximo;

        //Incrementa a variavel da posicao dos elementos
        posicao++;
   }

   //Libera Memoria
   free(p);

}

//Adiciona um elemento ao comeco
void adcComecoEncadeada(album *&ponteiroEncadeada, string nome, int ano){

    //Cria uma nova estrutura
    album *novovalor = new album;
    novovalor->nome = nome;
    novovalor->ano = ano;
    novovalor->proximo = ponteiroEncadeada;

    //Redireciona o ponteiro
    ponteiroEncadeada = novovalor;

}

//Adiciona um elemento ao fim
void adcFimEncadeada(album *ponteiroEncadeada, string nome, int ano){

    //Cria um novo valor
    album *novoValor = new album;
    novoValor->nome = nome;
    novoValor->ano = ano;
    novoValor->proximo = NULL;

    //Cria um cursor que percorre a lista
    album *p = ponteiroEncadeada;

        //Enquanto o p nao for nulo
        while(p != NULL){

            //Se estiver no ultimo elemento
            if(p->proximo == NULL){

                //Faz ele acrescentar o novo valor e sair do while
                p->proximo = novoValor;
                return;
            }

            //Transforma o P no endereco do proximo valor
            //Caso o endereco seja NULL, estamos no fim da lista
            //E saimos do while
            p = p->proximo;

        }

    //Libera Memoria
    free(p);
    free(novoValor);

}

//Adiciona valor numa posicao especifica
void adcPosicaoEncadeada(album *ponteiroEncadeada,string nome,int ano, int posicao){

    //Criar NODE com um valor
    album *novoValor = new album;
    novoValor->nome = nome;
    novoValor->ano = ano;
    novoValor->proximo = NULL;

    //Ponteiro Auxiliar
    album *p = ponteiroEncadeada;

    //Variavel que percorre a lista
    int i = 0;

    //Criar o auxiliar para Salvar o endereco em K-1 ->proximo
    while(i <= posicao){

        if(i == posicao-1){

            //Auxiliar do valor
            album *aux = new album;

            //Precisamos armazenar o endereco a ser apontado pelo novo node
            aux->proximo = p->proximo;

            //Fazendo o elemento K-1 apontar para o novo NODE
            p->proximo = novoValor;

            //Fazendo o novo NODE apontar para a auxiliar
            novoValor->proximo = aux->proximo;

            //Libera a Memoria
            free(aux);

        }

        //Analisa o proximo membro da lista
        p = p->proximo;

        //Contador de posiчѕes
        i++;

    }

}

//Remove o elemento inicial
void removeInicioEncadeada(album *&ponteiroEncadeada, string *nome, int *ano){

    //Retorna o nome do removido
    *nome = ponteiroEncadeada->nome;
    *ano = ponteiroEncadeada->ano;

    //O ponteiroEncadeada recebe o endereo do proximo elemento,Agora o segundo elemento torna-se o ponteiroEncadeada
    ponteiroEncadeada=ponteiroEncadeada->proximo;

}

//Remove do final da lista
void removeFinalEncadeada(album *&ponteiroEncadeada, string *nome, int *ano){

    //Auxiliares
    album *p = new album;
    album *aux = new album;

    //Se houver apenas um elemento na lista
    if(ponteiroEncadeada->proximo == NULL){

        //Recupera o nome e ano de quem saiu
        *nome = ponteiroEncadeada->nome;
        *ano = ponteiroEncadeada->ano;

        //Libera a Memoria do unico elemento e o deixa nulo
        free(ponteiroEncadeada);
        ponteiroEncadeada = NULL;

    }else{

        //Se houver mais de um elemento, nosso auxiliar p iguala-se ao ponteiroEncadeada
        p = ponteiroEncadeada;

        //Enquanto nao estiver no ultimo termo,o auxiliar torna-se o proximo
        //ate que o aux seja o penultimo elemento da lista
        while(p->proximo != NULL){
            aux = p;
            p=p->proximo;
        }

        //passa o valor do ultimo elemento para a variavel "valor"
        *nome = p->nome;
        *ano = p->ano;

        //Aqui, o aux representa o peultimo elemento da lista
        //Tornando-o o ultimo elemento da lista
        aux->proximo = NULL;

        //Este codigo щ para fazer a limpeza de memoria
        free(p);

    }
}

//Remove posiчуo especэfica
void removePosicaoEncadeada(album *ponteiroEncadeada,string *nome,int *ano, int posicao){

    //Ponteiro Auxiliar
    album *p = ponteiroEncadeada;

    //Variavel que percorre a lista
    int i = 0;

    //Navega pela lista
    while(i <= posicao){

        //Caso tenha alcanчado a posicao desejada
        if(i == posicao-1){

            //Retorna os dados do usuario a ser removido
            *nome = p->nome;
            *ano = p->ano;

            //Auxiliar do valor
            album *aux = new album;

            //Precisamos armazenar o endereco a ser apontado pelo novo node
            aux = p->proximo;

            //Fazendo o elemento K apontar para o novo NODE (2 membros a frente)
            p->proximo = aux->proximo;

            //Libera a Memoria
            free(aux);
        }

        //Analisa o proximo membro da lista
        p = p->proximo;

        //Contador de posiчѕes
        i++;
    }

    free(p);
}

string retornaNomeEncadeada(album *&ponteiroEncadeada, int ano){

   //nome return
   string nome = "Nao existe";

   //ponteiro auxiliar
   album *p = ponteiroEncadeada;

   //le a lista
   while(p->proximo != NULL){

       if(p->ano == ano){

            nome = p->nome;

            return nome;

       }
        p = p->proximo;
   }
return nome;
}

int main(){

    //Variсveis
    int funcaoDesejada = 1, tamanho;

    //Cria o inicio da lista Encadeada
    album *ponteiroEncadeada;

     //Manipula as listas
    while(funcaoDesejada < 10 && funcaoDesejada > 0){

        cout << "Operacoes \n";
        cout << "1 - Insira um album no inicio da lista \n";
        cout << "2 - Insira um album no fim da lista \n";
        cout << "3 - Insira um album na posicao N \n";
        cout << "4 - Retirar um album do inicio da lista \n";
        cout << "5 - Retirar um album no fim da lista \n";
        cout << "6 - Retirar um album na posicao N \n";
        cout << "7 - Procurar um album com o campo nome \n";
        cout << "8 - Imprimir a Lista. \n";
        cout << "9 - Sair do sistema. \n";
        cout << "10 - Help";
        cout << "\nEscolha um numero e pressione ENTER: \n";

        cout << "\nTamanho Atual[" << retornaTamanhoListaEncadeada(ponteiroEncadeada) << "]\n";

        imprimeEncadeada(ponteiroEncadeada);

        //Lъ a opчуo
        cin >> funcaoDesejada;

        //Limpa as opчѕes
        limpatela();

        //Variсveis para valores novos
        string nome;
        int ano, posicao,posicaoNaLista;

        //Alterna as Operacoes
        switch(funcaoDesejada){

            case 1:

                //Cabecalho da acao
                cout << "Funcao Escolhida: Insira um album no inicio da lista\n";

                //Lendo valores do usuario
                cout << "\nDigite o nome do album: ";
                cin >> nome;
                cout << "Digite o ano lancado: ";
                cin >> ano;

                //Adiciona no inicio
                adcComecoEncadeada(ponteiroEncadeada, nome, ano);

                //Exibe o usuario inserido
                cout << "Album: " << nome << ",ano: " << ano << " adicionado ao inicio da lista)";

                break;

            case 2:

                //Cabecalho da acao
                cout << "Funcao Escolhida: Insira um album no fim da lista\n";

                //Lendo valores do usuario
                cout << "\nDigite o nome: ";
                cin >> nome;
                cout << "Digite o ano: ";
                cin >> ano;

                if(retornaTamanhoListaEncadeada(ponteiroEncadeada) < 1){

                        //Adiciona ao inicio da Lista
                        adcComecoEncadeada(ponteiroEncadeada, nome, ano);

                }else{

                        //Adiciona ao fim da Lista
                        adcFimEncadeada(ponteiroEncadeada, nome, ano);
                }

                //Exibe o usuario inserido
                cout << "Usuario: "<< nome<< ",ano: "<< ano<< " adicionado ao final da lista("<< retornaTamanhoListaEncadeada(ponteiroEncadeada) << ")";

                break;

            case 3:

                //Cabecalho da acao
                cout << "Funcao Escolhida: Insira um album na posicao N \n";

                //Lendo valores do usuario
                cout << "\nDigite a Posicao: ";
                cin >> posicao;
                cout << "Digite o album: ";
                cin >> nome;
                cout << "Digite o ano: ";
                cin >> ano;

                if(posicao == 0 ){

                    //Adiciona ao inicio da Lista
                    adcComecoEncadeada(ponteiroEncadeada, nome, ano);

                }else if(posicao == retornaTamanhoListaEncadeada(ponteiroEncadeada) - 1){

                    //Adiciona ao fim da Lista
                    adcFimEncadeada(ponteiroEncadeada, nome, ano);

                }else{

                    //Adiciona na posicao N da Lista
                    adcPosicaoEncadeada(ponteiroEncadeada,nome,ano, posicao);

                }

                //Exibe o album inserido
                cout << "Album: " << nome << ",ano: " << ano << " adicionado na posicao "  <<  posicao  << " da lista.";

                break;

            case 4: //Remove no inicio

                if(retornaTamanhoListaEncadeada(ponteiroEncadeada) == 0){
                    cout << "Lista Vazia";

                }else{

                    //Remove no inicio
                    removeInicioEncadeada(ponteiroEncadeada, &nome, &ano);

                    //Exibe o album removido
                    cout << "album: " << nome<< ",ano: " << ano << " foi removido do inicio";
                }

                break;

            case 5:


                //Remove no final
                removeFinalEncadeada(ponteiroEncadeada, &nome, &ano);

                //Exibe o album removido
                cout << "album: " << nome << ",ano: " << ano << " foi removido do final.";

                break;

            case 6:

                //Cabealho da acao
                cout << "Funcao Escolhida: Remove um album na posicao escolhida\n";

                cout << "Tamanho da Lista" << retornaTamanhoListaEncadeada(ponteiroEncadeada);

                //Lendo valores do album
                cout << "\nDigite a Posicao: ";
                cin >> posicao;

                if(posicao == 0){

                    //Remove no inicio
                    removeInicioEncadeada(ponteiroEncadeada, &nome, &ano);

                }else{

                    //Remove na posicao N
                    removePosicaoEncadeada(ponteiroEncadeada, &nome, &ano, posicao);

                }

                //Exibe o album removido
                cout << "album: "<< nome<< ",ano: "<< ano<< " foi removido da posicao" << posicao;
                break;

            case 7:

                //Cabecalho da acao
                cout << "Funcao Escolhida: Retorna o nome e a posicao pelo nome\n";

                //Lendo valores do album
                cout << "Digite o ano: ";
                cin >> ano;

				cout << "O nome do ano:" << ano << " eh : " << retornaNomeEncadeada(ponteiroEncadeada, ano);
                break;

            case 8:

                imprimeEncadeada(ponteiroEncadeada);

                break;
            case 9:
            	system("pause");
            case 10:
            	cout<<"Ola você entrou na ajuda. o progrma eh bem simples bem intuitivo com tudo explicado voce poderá listar quantos albuns desejar e ate modificar suas ordens do jeito que desejar imprimir retirar mudar o que for possivel :)";

        }
    }

    return 0;
}

Ola boa noite estou tentando desenvolver um codigo como cadastro de albuns e nome e o ano de lancamento mais mue ocdigo nao roda

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Não use acentos em seu programa. Em variáveis, em strings ou em comentários, a menos que o enunciado exija. Não vai aprender nada e só vai ter problemas

  • Não use system() para nada. Não estará fazendo nada. Não há nada que possa fazer com system() que não possa fazer em C ou C++. system() foi escrita em C e o sistema quase todo também. E em geral é proibido em empresas e escolas afinal: é um risco grande de segurança

  • main() deve ser a primeira função de seu programa. Se possível em um arquivo separado. Há muitas razões para isso, mas em especial vai gostar de começar a ler seus programas e os de outros a partir de main() e a partir do início do texto. Ao mesmo tempo.

  • Ao usar uma estrutura de dados, como uma lista encadeada, entenda que uma estrutura é um container. Até tem esse nome em C++. Em java são chamadas coleções. Se programar uma lista encadeada como se fosse um nó só vai trabalhar mais e à toa. E pode ver isso em seu programa.

  • evite retornar void: em geral é um desperdício. Muitas vezes um erro.

 

Mais sobre seu programa:

 

void removePosicaoEncadeada(album* ponteiroEncadeada, string* nome, int* ano, int posicao);

  

Evite a qualquer custo construções assim. NUNCA misture dados com a estrutura. Nunca misture dados com entrada e saída. Sempre vai cair na sua cabeça. nome, ano e posicao nada tem a ver com a lista. E não retorne void: retorne ponteiroEncadeada. Se você excluir o primeiro elemento da lista o início será alterado, só que vai morrer dentro da função porque não retorna nada e recebeu uma cópia do ponteiro apenas

 

Declare algo assim:
 

Lista*    removePosicaoEncadeada( Lista* ponteiroEncadeada, Item* item );

 

Assim por exemplo pode retornar o novo endereço. E se precisar incluir um novo item no registro? 

 

Entenda que sua lista não é um album. Seu album é que é uma lista. Essa distinção é essencial para você entender e não ter trabalho com estrutura de dados... Você vai usar sempre o mesmo código de lista se fizer um trabalho normal. Se usar como escreveu sempre vai fazer tudo de novo.

 

Esse problema se estende a outras funções de seu programa, como iniciar a lista ou inserir.

 

string retornaNomeEncadeada(album*& ponteiroEncadeada, int ano);

 

Nunca misture a lista com o conteúdo. Entenda que seu próximo exercício de lista vai ser igualzinho. Sua lista pode ser de livros, aquela clássica de músicas, aquela de fornecedores e produtos. Mas é a mesma coisa. Então programe assim. Várias linguagens tem suporte a listas embutido, como python e C++ e java. Deve imaginar que usam as mesmas funções para qualquer tipo de lista... Então faça igual.

 

Essa construção album*& não tem sentido. Que pretendia fazer? Um é o contrário do outro.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!