Lista duplamente encadeada

1. Lista duplamente encadeada

Wendel Rios
wendelrios

(usa Ubuntu)

Enviado em 20/06/2017 - 23:36h

Alguém pode me ajudar a estar criando uma função que percorra uma lista duplamente encadeada e exiba o menor elemento, o anterior e o próximo desse menor elemento, agradeço desde já.


  


2. Re: Lista duplamente encadeada

Perfil removido
removido

(usa Nenhuma)

Enviado em 21/06/2017 - 00:14h

Você consegue desenhar a estrutura no papel?
Onde vão os ponteiros?
Onde vai o dado armazenado?
Como elas se interligam?
Sabe fazer alocação de memória?
É C ou C++?

Se sim falta você esboçar um código.
É necessário.


3. Re: Lista duplamente encadeada

Wendel Rios
wendelrios

(usa Ubuntu)

Enviado em 21/06/2017 - 00:40h

eu fiz uma função no caso de ir percorrendo a lista e guardar o menor em um nó ( n cheguei a criar caso o elemento menor fosse o ultimo e tal), o código complia e executa, mas qnd chega no momento de executar a função o código trava, e eu n to entendendo o pq.


4. Re: Lista duplamente encadeada

Perfil removido
removido

(usa Nenhuma)

Enviado em 21/06/2017 - 00:49h

Poderia postar o código?

----------------------------------------------------------------------------------------------------------------
Nem direita, nem esquerda. Quando se trata de corrupção o Brasil é ambidestro.
(anônimo)

Encryption works. Properly implemented strong crypto systems are one of the few things that you can rely on. Unfortunately, endpoint security is so terrifically weak that NSA can frequently find ways around it. — Edward Snowden



5. Re: Lista duplamente encadeada

Wendel Rios
wendelrios

(usa Ubuntu)

Enviado em 21/06/2017 - 00:59h

#include<iostream>

using namespace std;

struct no{
int info;
struct no *prox;
struct no *ant;

};
typedef struct no *lista;

lista inicio = NULL;
lista fim = NULL;

int menu()
{
int opc;
cout << "\n\n Digite a opção desejada: ";
cin >> opc;
return opc;
}

bool listavazia(){
if(inicio){
return false;
}else{
return true;
}
}

void insere(){
lista p, aux = inicio ;
p = new no;
cout<<"Insira um numero na lista"<<endl;
cin>>p->info;
p->prox = NULL;
if(listavazia()){
inicio = p;
}else{
aux = inicio;
while( aux->prox != NULL){
aux = aux->prox;
}
aux->prox = p;
p->ant=aux;
}
}

void excluir(){ // nessa função o usuário escolhe um numero para excluir
int linha;
lista anterior = inicio, p = inicio, aux;
bool achei = false;
if(!listavazia()){
cout<<"Qual numero sera excluido";
cin>>linha;
while(p!=NULL && achei == false){
if(p->info == linha){
achei == true;
}else{
anterior = p;
p = p->prox;
}
}
if(!achei){
cout<<"Numero desconhecido"<<endl;
}
if(achei){
if(anterior == inicio){
inicio = inicio ->prox;
cout<<"Numero excluido";
}else{
anterior->prox = p->prox;
delete(p);
cout<<"Numero excluido"<<endl;
}
}else{
cout<<"Lista Vazia"<<endl;
}
}

}
void percorre(){
lista aux=inicio, menor=aux->prox , result = NULL;



if(aux == NULL){
cout<<"lista vazia"<<endl;
}


while(aux!=NULL){
if(aux < menor){
result = aux;
aux = aux->prox;
menor = menor->prox;
}else{
aux = aux->prox;
menor = menor->prox;


}
}


cout<<"\n"<<result->info;
cout<<"\nElemento anterior: "<<result->ant;
cout<<"\nElemento posterior: "<<result->prox;
}

int main() {
cout << "\n MENU:";
cout << "\n 1 - Inserir Numero.";
cout << "\n 2 - Excluir numero.";
cout << "\n 3 - Menor no.";
cout << "\n 0 - Sair";
int op;
do{
op = menu();
switch(op) {
case 1: insere (); break;
case 2: excluir (); break;
case 3: percorre (); break;
}
}while (op != 0 );
}



6. Re: Lista duplamente encadeada

Paulo
paulo1205

(usa Ubuntu)

Enviado em 21/06/2017 - 14:31h

Há algumas coisas estranhas no programa que você postou. Entre elas, destaco as seguintes:

1) O ponteiro fim não está sendo usado em qualquer lugar do programa. Se você o utilizasse, a inserção no fim da lista se tornaria uma operação mais barata (O(1), em vez de O(n)).

2) Na função insere(), você deixa p->ant com valor indefinido se o nó for o primeiro da lista. Acho que seria bom usar nullptr.

3) Aliás, use sempre nullptr em C++. NULL tem comportamentos diferentes em C e em C++. Veja https://www.vivaolinux.com.br/topico/C-C++/C-qual-usar-NULL-ou-0-ou-nullptr.

4) O último bloco else na função excluir() está ligado ao if errado.

5) Aliás, aquele “if(achei)”, ao qual o else acima referido está erroneamente ligado, poderia ser apenas um else do “if(!achei)” que está logo acima.

6) Ainda em excluir(), parece-me que você não está tratando o nó que tem o nós a ser excluído como antecessor. Sendo a lista duplamente encadeada, isso deveria ocorrer.

7) Em percorre(), não entendi por que motivo você presumiu que o menor é inicio->prox. Por que inicio não conta?

8) Aliás, esse valor inicial de menor vai causar problemas se a lista estiver vazia, porque você não poderia tentar usar inicio->prox quando o próprio inicio for nulo.

9) Na mesma função, você faz um teste para ver se a lista está vazia, mas não evita a execução do código que só poderia ser executado se a lista não o estivesse. Ou você coloca esse código num bloco else, ou muda a ordem dos testes e a organização da função.

10) Qual o sentido de testar “aux < menor”, sendo aux e menor ponteiros? Será que você não quis dizer “aux->info < menor->info”?


7. Re: Lista duplamente encadeada

Wendel Rios
wendelrios

(usa Ubuntu)

Enviado em 22/06/2017 - 22:53h

opa, Paulo, valeu pelas dicas, algumas eu nem tinha conhecimento como por exemplo essa do nullptr em c++, vou passar a usar dessa forma q vc ensinou. Eu estou refazendo o código, até pq esse eu fiz em aula cm outro aluno da turma, e eu entendia menos de ponteiros do q entendo atualmente. Obrigado pela atenção, acontecendo algum erro no código voltarei a recorrer aos fóruns.


8. Re: Lista duplamente encadeada

Wendel Rios
wendelrios

(usa Ubuntu)

Enviado em 23/06/2017 - 15:57h

Estou refazendo esse código da lista duplamente encadeada cm as devidas funções inserir, retirar, listar , só q tá ocorrendo um erro esquisito q n to entendendo. Eu executo o codigo, insiro os numeros 30, 20 e 10, e quando peço pra listar só exibe o 30 e o 10. eu já revisei as funções inserir e listar, e no meu ver tá correto.
#include<iostream>

using namespace std;

struct no{
int info;
int antecessor;
int sucessor;
struct no *prox;
struct no *ant;
};typedef struct no *lista;

lista inicio = NULL;
lista fim = NULL;

bool listavazia( ){
if(inicio){
return false;
}else {
return true;
}
}


void insere(){
lista p;
p = new no;
cout<<"Insira um numero na lista ";
cin>>p->info;
p->prox = NULL;
cout<<"Numero "<<p->info<<" inserido na lista\n\n";
if(listavazia()){
inicio = p;
fim = p;
} else{
inicio->prox = p;
p->ant = inicio;
p->prox = NULL;
fim = p;
}
}

void retira() {
lista p=inicio, aux= p->prox;
int num;

cout<<"Qual numero sera excluido\n\n";
cin>>num;
if(p==NULL){
cout<<"A lista esta vazia!\n\n";
}else{
while(p!=NULL){
if(num == p->info && p->ant == NULL){
inicio = p->prox;
aux->ant = inicio;
delete(p);

}
}
}
}

void listar(){
lista p=inicio;

if(!listavazia()){
cout<<"A lista esta assim: \n\n";
while(p!=NULL){
cout<<"\t||"<<p->info;
p=p->prox;
}
}else{
cout<<"A lista esta vazia!!\n\n";
}

}



void menu(int op) {

do{


cout<<"\n----MENU----\n\n";
cout<<"--1--Inserir na Lista\n\n";
cout<<"--2--Remover item da Lista\n\n";
cout<<"--3--Listar elementos da Lista\n\n";
cout<<"--0--Sair\n\n";
cin>>op;


switch(op){

case 1: insere();
break;

case 2: retira();
break;

case 3: listar();
break;


}

}while(op!=0);
}





int main(){

int op;

menu(op);
}




9. Re: Lista duplamente encadeada

Wendel Rios
wendelrios

(usa Ubuntu)

Enviado em 24/06/2017 - 11:58h

Alguém q possa me ajudar nesse código. Continua dando o erro na hora de listar, ele só lista o 1º e o último elemento da lista. Segue o código atualizado abaixo.

#include<iostream>

using namespace std;

struct no{
int info;
int antecessor;
int sucessor;
struct no *prox;
struct no *ant;
};typedef struct no *lista;

lista inicio = NULL;
lista fim = NULL;

bool listavazia( ){
if(inicio){
return false;
}else {
return true;
}
}


void insere(){
lista p;
p = new no;
cout<<"Insira um numero na lista ";
cin>>p->info;
p->prox = NULL;
cout<<"Numero "<<p->info<<" inserido na lista\n\n";
if(listavazia()){
inicio = p;
fim = p;
} else{
inicio->prox = p;
p->ant = inicio;
p->prox = NULL;
fim = p;
}
}

void retira() {
lista p=inicio, aux= p->prox, post;
int num;

cout<<"Qual numero sera excluido\n\n";
cin>>num;
if(p==NULL){
cout<<"A lista esta vazia!\n\n";
}else{
while(p!=NULL){
if(num == p->info && p->ant == NULL){
aux = p->prox;
aux->ant = inicio;
inicio = aux;
delete(p);
cout<<"\n\nNo retirado.";
}else if(num == p->info && p->prox == NULL){
aux = p->ant;
fim = aux;
aux->prox = NULL;
delete(p);
cout<<"\n\nNo retirado";
}else{
aux = p->ant;
post = p->prox;
aux->prox = post;
post->ant = aux;
delete(p);
}
}
}
}

void listar(){
lista p=inicio;

if(!listavazia()){
cout<<"A lista esta assim: \n\n";
while(p!=NULL){
cout<<"\t||"<<p->info;
p=p->prox;
}
}else{
cout<<"A lista esta vazia!!\n\n";
}

}



void menu(int op) {

do{


cout<<"\n----MENU----\n\n";
cout<<"--1--Inserir na Lista\n\n";
cout<<"--2--Remover item da Lista\n\n";
cout<<"--3--Listar elementos da Lista\n\n";
cout<<"--0--Sair\n\n";
cin>>op;


switch(op){

case 1: insere();
break;

case 2: retira();
break;

case 3: listar();
break;


}

}while(op!=0);
}





int main(){

int op;

menu(op);
}








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts