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