Lista duplamente encadeada

1. Lista duplamente encadeada

Kauê Ribeiro
KaueR

(usa Fedora)

Enviado em 31/10/2016 - 10:04h

Pessoal, sera que alguém consegue me dar uma ajuda, tenho que fazer uma lista duplamente encadeada, com ELO.ANTERIOR/ INFO/ ELO.POSTERIOR, no entanto consegui fazer apenas uma lista encadeada simples, sem elo anterior. segue o código.


#include <iostream>
#include <cstdio>
#include <cstdlib>

#define TAM 5 //constante
#define NC 0

using namespace std;

struct lista{
    int info;
    int elo;
};

void incializaLista(lista *p);
bool listaVazia(lista *p);
bool listaCheia(lista *p);
void incluir(lista *p, int valor);
void mostraLista(lista *p);
int acha_indice(lista *p, int valor);
int excluir(lista *p, int pos);

main()
{
   //declarar variável
   lista umaLista[TAM];
   //incializar a fila
   incializaLista(umaLista);

   int menu, temp, x;
   do
   {
       system("cls");
       cout << "0 - Sair." << endl;
       cout << "1 - Incluir." << endl;
       cout << "2 - Mostrar." << endl;
       cout << "3 - Excluir." << endl;
       cout << "Sua escolha: ";
       cin >> menu;
       fflush(stdin);
       switch(menu)
       {
          case 0:
             system("cls");
             cout << "Programa encerrado.";
             getchar();
             break;
          case 1:
             if(!listaCheia(umaLista))
             {
                cout<< "Digite um valor inteiro: ";
                cin>> temp;
                fflush(stdin);
                incluir(umaLista, temp);
             }
             else
                cout << "Lista cheia.";
             getchar();
             break;
          case 2:
             if(listaVazia(umaLista))
                cout<<"Lista vazia.\n";
             else
                mostraLista(umaLista);
             getchar();
             break;
          case 3:
            if(listaVazia(umaLista))
                cout<<"Lista vazia.\n";
            else
            {
                cout << "Informe o valor a ser excluido: ";
                cin >> temp;
                fflush(stdin);
                x = acha_indice(umaLista, temp);
                if(x == -1)
                {
                    cout << "O valor " << temp;
                    cout << "Nao pertence a lista";
                }
                else
                {
                    excluir(umaLista, x);
                }
            }
            getchar();
            break;
          default :
             cout << "Opcao invalida.";
             getchar();
             break;
       }
    }while(menu != 0);
}

void incializaLista(lista *p)
{
    int i;
    p[NC].elo = -1;
    p[NC].info = -1;
    for(i = 1; i < (TAM - 1); i++)
    {
        p[i].elo = i + 1;
    }
    p[i].elo = -1;
}

bool listaVazia(lista *p)
{
    if((p[NC].info == -1) and (p[NC].elo == -1))
        return true;
    else
        return false;
}

bool listaCheia(lista *p)
{
    if(p[p[NC].info].elo == -1)
    {
          cout << "Fila cheia.";
          getchar();
          return true;
    }
    else
        return false;
}

void incluir(lista *p, int valor)
{
    if(!listaCheia(p))
    {
        //faz a inclusao
        if(listaVazia(p))
        {
            p[1].info = valor;
            p[NC].info = 1;
            p[NC].elo = 1;
        }
        else
        {
            p[p[p[NC].info].elo].info = valor;
            p[NC].info = p[p[NC].info].elo;
        }
    }else
      cout<<"Lista cheia.\n";
}

int acha_indice(lista *p, int valor)
{
    int i;
    i = p[NC].elo;
    while(i != -1)
    {
        if(valor == p[i].info)
            return i;
        if(i == p[NC].info)
            return -1;
        i = p[i].elo;
    }
}

int excluir(lista *p, int pos)
{
    int temp;
    if(p[NC].info == p[NC].elo)
    {
        //é o único elemento da lista
        p[NC].info = -1;
        p[NC].elo = -1;
    }
    else if(pos == p[NC].elo)
    {
        //se for o primeiro elemento da lista
        p[NC].elo = p[pos].elo;
        p[pos].elo = p[p[NC].info].elo;
        p[p[NC].info].elo = pos;
    }
    else if(pos == p[NC].info)
    {
        //se for o ultimo elemento da lista
        temp = p[NC].elo;
        while(p[temp].elo != pos)
        {
            temp = p[temp].elo;
        }
        p[NC].info = temp;
    }
    else
    {
        temp = p[NC].elo;
        while(p[temp].elo != pos)
        {
            temp = p[temp].elo;
        }
        p[temp].elo = p[pos].elo;
        p[pos].elo = p[p[NC].info].elo;
        p[p[NC].info].elo = pos;
    }
}

void mostraLista(lista *p)
{
    int i;
    i = p[NC].elo;
    cout << "INICIO : " << p[NC].elo << endl;
    cout << "FIM : " << p[NC].info << endl;
    cout << "DISPONIVEL : " << p[p[NC].info].elo << endl;

    cout << "POS   " << " INFO   " << " ELO" << endl;
    cout << "NC      " << p[NC].info << "       ";
    cout << p[NC].elo << endl;


    while(i != -1)
    {
        cout << i << "       ";
        cout << p[i].info << "       ";
        cout << p[i].elo << endl;

        if(i == p[NC].info)
            break;
        i = p[i].elo;
    }
}
 




  


2. Re: Lista duplamente encadeada

joao pedro ache virgili
joaovirgili

(usa Ubuntu)

Enviado em 31/10/2016 - 12:24h

posta o codigo no www.pastebin.com, fica melhor de visualizar!


3. Re: Lista duplamente encadeada

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 31/10/2016 - 12:43h

Olá, bom dia.

Coloque seu código entre as tags [ code] e [ /code] (sem espaços). Assim fica melhor de visualizar aqui no fórum.

Enzo Ferber
[]'s


$ indent -kr -i8 src.c

"(...)all right-thinking people know that (a) K&R are _right_ and (b) K&R are right." 
        - linux/Documentation/CodingStyle - TORVALDS, Linus. 
 







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts