GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Erro na função Mostrar() ou Inserir() de uma Lista Duplamente Encadeada C++

programação
Tags: #<Tag:0x00007efdad1614d8>

#1

Não estou conseguindo inserir um valor ou mostrar, não consigo saber qual função não está funcionando, eu consigo imprimir o ultimo valor pela função Mostrar(), mas os demais que eu insiro nao aparecem, aí eu nao sei se talvez nao esteja inserindo corretamente, ou se a função imprimir está imprimindo só o ultimo.

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

using namespace std;

typedef struct no{
    int *valor;
    struct no *prox;
   struct no *ant;
}no;

typedef no lista;

void Criar(lista *linicio, lista *lfinal);
void Inserir(lista *linicio, lista *lfinal, int *novoElem);
void Remover(lista *linicio, lista *lfinal, int *novoElem);
void Mostrar(lista *linicio, lista *lfinal);
int operacao;
int novoElem;
lista linicio;
lista lfinal;

void Criar(lista* linicio, lista* lfinal){
    linicio->prox = lfinal;
    linicio->ant = NULL;
    lfinal->prox = NULL;
    lfinal->ant = linicio;

    cout << "LISTA CRIADA" << endl;
}
void Inserir(lista *linicio, lista *lfinal, int *novoElem){
    lista* novo = (lista*)malloc(sizeof(lista));

    novo->valor = novoElem;

    novo->prox = lfinal;
    novo->ant = lfinal->ant;

    lfinal->ant->prox = novo;
    lfinal->ant = novo;

    cout << "ELEMENTO " << novoElem << " INSERIDO" << endl;
    cout << "VALOR " << valor << " INSERIDO" << endl;


}

void Remover(lista *linicio, lista *lfinal, int *novoElem){
    lista *p;
    p = linicio->prox;
    while((p != lfinal) && ((novoElem, p->valor) != 0) ){
        p = p->prox;
    }

    if( p == lfinal){
        cout << "ELEMENTO NAO ESTA NA LISTA" << endl;
        } else {
            p->ant->prox = p->prox;
            p->prox->ant = p->ant;
            free(p);
            cout << "ELEMENTO REMOVIDO" << endl;
        }
}

void Mostrar(lista *linicio, lista *lfinal){
    lista *p = linicio->prox;
    while( p != lfinal){
            for (int i = 0; i <50; i ++){
                cout << p->valor << "<< >>" << novoElem << endl;
                p = p->prox;
            }
    }
    cout << endl;
}

int Menu(){
    cout << "1 - CRIAR LISTA" << endl;
    cout << "2 - INSERIR" << endl;
    cout << "3 - REMOVER" << endl;
    cout << "4 - MOSTRAR" << endl;
    cout << "5 - FECHAR" << endl;
    cout << endl;
    cin >> operacao;
    cout << endl;
    switch (operacao) {
    case 1 :
        Criar(&linicio, &lfinal);
        break;
    case 2 :
        cout << "DIGITE UM VALOR PARA INSERIR" << endl << endl;
        cin >> novoElem;
        cout << endl;
        Inserir(&linicio, &lfinal, &novoElem);
        break;
    case 3 :
        Remover(&linicio, &lfinal, &novoElem);
        break;
    case 4 :
        //Mostrar(linicio, lfinal);
       Mostrar(&linicio, &lfinal);
       break;
    }
    return 0;
}

int main(){

    while (operacao!=5){
        Menu();
        cout << "__________________________" << endl;
        cout << endl;
    }
}

#2

A função mostrar, não seria melhor assim?

void Mostrar(lista *p) {
    while(p != NULL) {
        cout << p->valor << "<< >>" << novoElem << endl;
        p = p->prox;
    }
    cout << endl;
}

E você passaria apenas o linicio

Porque usar for dentro de while na função?

Não vi você alocar memória para linicio e lfinal