Ir ao conteúdo

Posts recomendados

Postado
#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
Postado
  • 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

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