Enviado em 22/08/2021 - 11:10h
#include <cstdlib> #include <iostream> #include <iomanip> #include "Funcoes22049.h" using namespace std; int main (int argc, char *argv[]) { ListaDupla list1; list1.insere(1,0), list1.insere(2,1), list1.insere(5,2), list1.insere(7,3); cout << "tamanho: " << list1.tamanho() << endl; int y = 0; cout << "Quantidade: " << list1.quantidade(y) << endl; cout << "Lista" << endl; list1.imprimeLista(); list1.retira(2); cout << "tamanho: " << list1.tamanho() << endl; int x = 0; list1.obtem(x,1); cout << "Valor: " << 5 << " posição: 3" << endl; cout << "Lista" << endl; list1.imprimeLista(); if(list1.tamanho() == 0) cout << "lista está vazia" << endl; else{ cout << "tamanho: " << list1.tamanho() << endl; }; cout << "Quantidade: " << list1.quantidade(y) << endl; } #include "Funcoes22049.h" #include <iomanip> #include <iostream> using namespace std; ListaDupla::ListaDupla() { primeiro = NULL; ultimo = NULL; } void ListaDupla::limpa() { Elemento *z = primeiro; // z aponta para o início. // Percorrer toda a lista para desalocar os elementos. Elemento *y = NULL; while(z != 0){ y = z->prox; delete z; z = y; } primeiro = 0; // Indica que a lista está vazia. } bool ListaDupla::vazia() { return primeiro == 0; } ListaDupla::~ListaDupla() { limpa(); } bool ListaDupla::insere(Valor x, int pos) { if(pos < 0) return false; // pos inválida. else{ Elemento *y, *z, *w; // y é o ponteiro anterior e z o atual. y = 0; // y não aponta para ninguém. z = primeiro; // z aponta para o primeiro elemento. int p = 0; // Indice do primeiro elemento. while(p < pos && z != 0){ // A posição é válida. p++; // Próximo indice. y = z; // O anterior é o atual. z = z->prox; // O atual é o proximo da lista. } if(z == 0 && p == pos || z != 0){ // pos. inválida. w = new Elemento; // Tenta criar um novo elem. if(w != 0){ // Elemento criado. w->val = x; if(pos == 0) { // Ins. prim. pos. w->ant = NULL; w->prox = primeiro; primeiro->ant = w; primeiro = w; }else{ // Inserção demais posições. w->prox = y->prox; // anterior aponta para o proximo y->prox = w; w->ant = y; if(z != NULL) z->ant = w; } while(z->prox != NULL) // procuramos o ultimo elemento z = z->prox; ultimo = z; quant++; return true; } else return false; // Elemento não criado. } else return false; // Inserção em posição inválida. } } bool ListaDupla::retira(int pos) { // Verifica se é uma posição válida para remover. if(pos < 0 || pos >= tamanho()) return false; // Não é válida, não removeu. else{ // É válida. Elemento *y = primeiro; // y aponta p/ o primeiro. if(pos == 0) { // Remoção na primeira posição. // Removeremos o primeiro elemento da lista. primeiro = y->prox; // O segundo será o primeiro. primeiro->ant = NULL; // anterior do primeiro aponta para nulo delete y; // Remove o primeiro elemento da memoria. quant--; } else{ // A posição para remoção não é a primeira. // Percorre a lista até a posição da remoção. for(int i = 1; i < pos; i++){ y = y->prox;} Elemento *z = y->prox; // z aponta p/ o próximo. if(z->prox == NULL){ // z aponta para o ultimo y->prox = NULL; // y passa apontar para ultimo } else { // y aponta para o proximo y->prox=z->prox; y->prox->ant = z->ant; } while(y->prox != NULL) // procuramos o ultimo elemento y = y->prox; ultimo = y; delete z; // Remove o elemento da memória. quant--; } return true; // Indica que removeu o valor. } } int ListaDupla::tamanho() { if(primeiro == 0) return 0; // Está vazia. else{ // Não está vazia. int c = 1; // Inicializa o contador c em 1. Elemento *z = primeiro; // z aponta para o primeiro. // Percorre a lista até o último elemento. while(z->prox != 0){ c++; z = z->prox; } return c; // Retorna o tamanho contado por c. } } bool ListaDupla::obtem(Valor &x, int pos) { if(pos < 0 || pos >= tamanho()) return false; // Não é válida, não obteve. else{ // E válida. Elemento *z = primeiro; // z aponta para o primeiro. // Percorre a lista até a posição pos do elem. x. for(int i = 0; i < pos; i++) z = z->prox; x = z->val; // Volta em x o valor (referência). return true; // Indica que obteve o valor. } } void ListaDupla::imprimeLista(){ Elemento *z = primeiro; cout << "L -> "; while(z != NULL){ cout << z->val << " -> "; z = z->prox; } cout << "NULL" << endl; Elemento *w = ultimo; cout << "L -> "; while(w != NULL){ cout << w->val << " -> "; w = w->ant; } cout << "NULL" << endl; } int ListaDupla::quantidade(Valor &q) { return quant; } #ifndef LISTADUPLA_H #define LISTADUPLA_H //#include "Funcoes22047.h" class ListaDupla //: public Lista { private: typedef int Valor; struct Elemento { Valor val; // Material da seção. Elemento *prox; // Aponta para proximo. Elemento *ant; // Aponta para anterior. }; int quant = 0; Elemento *primeiro; // Aponte para o primeiro. Elemento *ultimo; // Aponte para o ultimo. public: // Construtor padrão: ListaDupla(); // Destruidor da lista: ~ListaDupla(); // Insere o valor x na posição pos da lista: bool insere(Valor x, int pos); // Retire o elemento da posição pos da lista: bool retira(int pos); // Retorna o tamanho da lista: int tamanho(); // Indica se a lista está vazia: bool vazia(); // Remove todos os elementos da lista: void limpa(); // Obtém o valor x da posição pos da lista: bool obtem(Valor &x, int pos); // Imprimir os dados da lista em suas posições void imprimeLista(); // Obtém a quantidade inserida na lista int quantidade(Valor &q); }; #endif resultado ao copilar Falha de segmentação (imagem do núcleo gravada) O problema maior se encontra na função inserir e na função retirar
Enviado em 23/08/2021 - 12:43h
Bom dia, prezado.Enviado em 23/08/2021 - 21:55h
Bom dia, caro colega.#ifndef LISTA_H #define LISTA_H class Lista { private: typedef int Valor; struct Elemento { Valor val; // Material da seção. Elemento *prox; // Aponta para o próximo. }; Elemento *primeiro; // Aponte para o primeiro. // Copia profundamente os elementos de uma lista e é // usado no construtor de cópia e na atribuição: void copiaProfunda(Lista &lista); public: // Construtor padrão: Lista(); // Destruidor da lista: virtual ~Lista(); // Construtor de cópia da lista: Lista(Lista &lista); // Operação de Atribuição da lista: Lista & operator = (Lista &lista); // Insere o valor x na posição pos da lista: virtual bool insere(Valor x, int pos); // Retire o elemento da posição pos da lista: virtual bool retira(int pos); // Retorna o tamanho da lista: virtual int tamanho(); // Indica se a lista está vazia: virtual bool vazia(); // Remove todos os elementos da lista: virtual void limpa(); // Obtém o valor x da posição pos da lista: virtual bool obtem(Valor &x, int pos); }; #endif
#include "Funcoes22047.h" #include <iomanip> Lista::Lista() { primeiro = 0; } void Lista::limpa() { Elemento *z = primeiro; // z aponta para o início. // Percorrer toda a lista para desalocar os elementos. Elemento *y; while(z != 0){ y = z->prox; delete z; z = y; } primeiro = 0; // Indica que a lista está vazia. } bool Lista::vazia() { return primeiro == 0; } Lista::~Lista() { limpa(); } int Lista::tamanho() { if(primeiro == 0) return 0; // Está vazia. else{ // Não está vazia. int c = 1; // Inicializa o contador c em 1. Elemento *z = primeiro; // z aponta para o primeiro. // Percorre a lista até o último elemento. while(z->prox != 0){ c++; z = z->prox; } return c; // Retorna o tamanho contado por c. } } bool Lista::obtem(Valor &x, int pos) { if(pos < 0 || pos >= tamanho()) return false; // Não é válida, não obteve. else{ // E válida. Elemento *z = primeiro; // z aponta para o primeiro. // Percorre a lista até a posição pos do elem. x. for(int i = 0; i < pos; i++) z = z->prox; x = z->val; // Volta em x o valor (referência). return true; // Indica que obteve o valor. } } bool Lista::insere(Valor x, int pos) { if(pos < 0) return false; // pos inválida. else{ Elemento *y, *z, *w; // y é o ponteiro anterior e z o atual. y = 0; // y não aponta para ninguém. z = primeiro; // z aponta para o primeiro elemento. int p = 0; // Indice do primeiro elemento. while(p < pos && z != 0){ // A posição é válida. p++; // Próximo indice. y = z; // O anterior é o atual. z = z->prox; // O atual é o proximo da lista. } if(z == 0 && p == pos || z != 0){ // pos. inválida. w = new Elemento; // Tenta criar um novo elem. if(w != 0){ // Elemento criado. w->val = x; w->prox = z; if(pos == 0) primeiro = w; // Ins. prim. pos. else y->prox = w; // Inserção demais posições. return true; } else return false; // Elemento não criado. } else return false; // Inserção em posição inválida. } } bool Lista::retira(int pos) { // Verifica se é uma posição válida para remover. if(pos < 0 || pos >= tamanho()) return false; // Não é válida, não removeu. else{ // É válida. Elemento *y = primeiro; // y aponta p/ o primeiro. if(pos == 0) { // Remoção na primeira posição. // Removeremos o primeiro elemento da lista. primeiro = y->prox; // O segundo será o primeiro. delete y; // Remove o primeiro elemento da memoria. } else{ // A posição para remoção não é a primeira. // Percorre a lista até a posição da remoção. for(int i = 1; i < pos; i++) y = y->prox; Elemento *z = y->prox; // z aponta p/ o próximo. y->prox = z->prox; delete z; // Remove o elemento da memória. } return true; // Indica que removeu o valor. } } void Lista::copiaProfunda(Lista &lista) { Elemento *z = lista.primeiro; if(z == 0) primeiro = 0; else{ primeiro = new Elemento; Elemento *y = primeiro; y->val = z->val; z = z->prox; while(z != 0){ y->prox = new Elemento; y = y->prox; y->val = z->val; z = z->prox; } y->prox = 0; } } Lista & Lista::operator = (Lista &lista) { if(this != &lista) copiaProfunda(lista); return *this; }
#include "Funcoes22049.h" #include <iomanip> #include <iostream> using namespace std; ListaDupla::ListaDupla() { primeiro = nullptr; ultimo = nullptr; } void ListaDupla::limpa() { Elemento *z = primeiro; // z aponta para o início. // Percorrer toda a lista para desalocar os elementos. Elemento *y; while(z != 0){ y = z->prox; delete z; z = y; } primeiro = nullptr; // Indica que a lista está vazia. } bool ListaDupla::vazia() { return primeiro == nullptr; } ListaDupla::~ListaDupla() { limpa(); } bool ListaDupla::insere(Valor x, int pos) { if(pos < 0) return false; // pos inválida. else{ Elemento *y, *z, *w; // y é o ponteiro anterior e z o atual. y = nullptr; // y não aponta para ninguém. z = primeiro; // z aponta para o primeiro elemento. int p = 0; // Indice do primeiro elemento. while(p < pos && z != nullptr){ // A posição é válida. p++; // Próximo indice. y = z; // O anterior é o atual. z = z->prox; // O atual é o proximo da lista. } if(z == 0 && p == pos || z != nullptr){ // pos. inválida. w = new Elemento; // Tenta criar um novo elem. if(w != 0){ // Elemento criado. w->val = x; w->prox = z;// se em caso for o ultimo aponta para NULL if(pos == 0){ w->ant = nullptr; // Ins. prim. pos. primeiro->ant = w; //w->prox = primeiro; primeiro = w; } else{ y->prox = w; // Inserção demais posições. w->ant = y; if(z != nullptr) z->ant = w; } while(z->prox != nullptr) // procuramos o ultimo elemento z = z->prox; ultimo = z; quant++; return true; } else return false; // Elemento não criado. } else return false; // Inserção em posição inválida. } } bool ListaDupla::retira(int pos) { // Verifica se é uma posição válida para remover. if(pos < 0 || pos >= tamanho()) return false; // Não é válida, não removeu. else{ // É válida. Elemento *y = primeiro; // y aponta p/ o primeiro. if(pos == 0) { // Remoção na primeira posição. // Removeremos o primeiro elemento da lista. primeiro = y->prox; // O segundo será o primeiro. primeiro->ant = 0; // anterior do primeiro aponta para nulo delete y; // Remove o primeiro elemento da memoria. quant--; } else{ // A posição para remoção não é a primeira. // Percorre a lista até a posição da remoção. for(int i = 1; i < pos; i++){ y = y->prox;} Elemento *z = y->prox; // z aponta p/ o próximo. if(z->prox == 0){ // z aponta para o ultimo y->prox = 0; // y passa apontar para ultimo } else { // y aponta para o proximo y->prox=z->prox; y->prox->ant = z->ant; } while(y->prox != 0) // procuramos o ultimo elemento y = y->prox; ultimo = y; delete z; // Remove o elemento da memória. quant--; } return true; // Indica que removeu o valor. } } int ListaDupla::tamanho() { if(primeiro == 0) return 0; // Está vazia. else{ // Não está vazia. int c = 1; // Inicializa o contador c em 1. Elemento *z = primeiro; // z aponta para o primeiro. // Percorre a lista até o último elemento. while(z->prox != 0){ c++; z = z->prox; } return c; // Retorna o tamanho contado por c. } } bool ListaDupla::obtem(Valor &x, int pos) { if(pos < 0 || pos >= tamanho()) return false; // Não é válida, não obteve. else{ // E válida. Elemento *z = primeiro; // z aponta para o primeiro. // Percorre a lista até a posição pos do elem. x. for(int i = 0; i < pos; i++) z = z->prox; x = z->val; // Volta em x o valor (referência). return true; // Indica que obteve o valor. } } void ListaDupla::imprimeLista(){ Elemento *z = primeiro; cout << "L -> "; while(z != 0){ cout << z->val << " -> "; z = z->prox; } cout << "NULL" << endl; Elemento *w = ultimo; cout << "L -> "; while(w != 0){ cout << w->val << " -> "; w = w->ant; } cout << "NULL" << endl; } int ListaDupla::quantidade(Valor &q) { return quant; }
Enviado em 24/08/2021 - 02:50h
Na postagem anterior, eu não compilei nada do código que você postou. Apenas examinei o que estava escrito.#include <iostream> #include <limits> using namespace std; class list_t { public: using value_t=int; private: struct element_t { value_t value; element_t *prev, *next; // O construtor pode popular os campos da estrutura. element_t(const value_t &v, element_t *before, element_t *after): value(v), prev(before), next(after) { } }; element_t *first, *last; size_t quant; public: list_t(): first(), last(), quant() { } ~list_t(){ clear(); } // Função de inserção genérica com especificador de posição. Qualquer posição maior que ou igual ao tamanho atual da lista // provoca inserção no final da lista, sem provocar erro. Por isso mesmo, o parâmetro ‘pos’ tem um valor default arbitra- // riamente grande, que provoca inserção no fim da lista caso a função seja invocada sem o segundo argumento. A função faz // uso do membro de dados ‘quant’ para tentar reduzir a distância da varredura, a depender de se a lista está vazia ou de se // a posição de inserção vem antes ou depois da metade da lista. // // A função retorna uma referência para a própria lista, o que é útil para encadear operações (ver exemplo de uso abaixo). // Note também que a função não tenta pegar erro de alocação dentro da função. Como tais erros disparam a exceção padronizada // std::bad_alloc, a função permite que essa exceção “vaze”, para que o chamador decida o que fazer, caso a receba. list_t &insert(const value_t &v, size_t pos=std::numeric_limits<size_t>::max()){ // Ponteiros para ponteiros, a fim de guardar referências para quais ponteiros devem ser modificados. element_t **p_before, **p_after; if(quant==0){ // Inserção na lista vazia. p_before=&first; p_after=&last; } else if(pos<=quant/2){ // Até a metade da lista, varre do início para o fim até achar a posição de inserção. p_after=&first; while(pos--) p_after=&(*p_after)->next; p_before=&(*p_after)->prev; } else{ // Após a metade da lista, varre do fim para o início até achar a posição de inserção. p_before=&last; while(pos++<quant) p_before=&(*p_before)->prev; p_after=&(*p_before)->next; } // Note que eu uso o construtor dos elementos para definir valor e ponteiros para os nós vizinhos. auto new_elem=new element_t(v, *p_before, *p_after); *p_before=*p_after=new_elem; ++quant; return *this; } // Faz a limpeza da lista. Retorna uma referência para a própria lista. list_t &clear(){ while(first){ auto n=first->next; delete first; first=n; } last=nullptr; quant=0; return *this; } friend ostream &operator<<(ostream &os, const list_t &t); }; ostream &operator<<(ostream &os, const list_t &t){ switch(t.quant){ case 0: os << "A lista está vazia.\n"; break; case 1: os << "A lista possui apenas um elemento: " << t.first->value << ".\n"; break; default: os << "A lista possui " << t.quant << " elementos:\n"; for(auto p=t.first; p!=t.last; p=p->next) os << " • ‘" << p->value << "’;\n"; os << " • ‘" << t.last->value << "’.\n"; } return os; } int main(){ list_t l; cout << l .insert(0) // Insere na lista vazia. .insert(3) // Insere no fim da lista (argumento default). .insert(1, 1) // Insere no meio da lista (varre do início para o fim). .insert(2, 2) // Insere no meio da lista (varre do fim para o início). ; cout << l.clear(); }
Enviado em 24/08/2021 - 21:52h
ultimo = NULL; while(z != NULL) // procuramos o ultimo elemento { ultimo = z; z = z->prox; }
if(pos == 0){ w->ant = nullptr; // Ins. prim. pos. if(primeiro != nullptr) primeiro->ant = w; w->prox = primeiro; primeiro = w;}
bool ListaDupla::insere(Valor x, int pos) { if(pos < 0) return false; // pos inválida. else{ Elemento *y, *z, *w; // y é o ponteiro anterior e z o atual. y = nullptr; // y não aponta para ninguém. z = primeiro; // z aponta para o primeiro elemento. int p = 0; // Indice do primeiro elemento. while(p < pos && z != nullptr){ // A posição é válida. p++; // Próximo indice. y = z; // O anterior é o atual. z = z->prox; // O atual é o proximo da lista. } if(z == 0 && p == pos || z != nullptr){ // pos. inválida. w = new Elemento; // Tenta criar um novo elem. if(w != 0){ // Elemento criado. w->val = x; w->prox = z;// se em caso for o ultimo aponta para NULL if(pos == 0){ w->ant = nullptr; // Ins. prim. pos. if(primeiro != nullptr) primeiro->ant = w; w->prox = primeiro; primeiro = w;} else{ y->prox = w; // Inserção demais posições. w->ant = y; if(z != nullptr) z->ant = w; } ultimo = nullptr; while(z != nullptr){ // procuramos o ultimo elemento ultimo = z; z = z->prox; } quant++; return true; } else return false; // Elemento não criado. } else return false; // Inserção em posição inválida. } }
Resolver problemas de Internet
Como compartilhar a tela do Ubuntu com uma Smart TV (LG, Samsung, etc.)
Descritores de Arquivos e Swappiness
Fez porcaria no teu repositório Git? Aprenda a restaurar uma versão anterior do seu código!
Restaurando Fontes de Download do Hydra no Linux
Atualizando "na marra" o YT-DLP quando começa a dar erro de downloads
Como instalar o WPS com interface e corretor ortográfico em PT-BR no Arch Linux
Bluetooth CSR 4.0 Dongle (Alternativo) (3)
Desbloquear chaveiro padrão (5)
como eu instalo o mali-t60x_r12... (5)