Preciso de uma ajuda mais resolver a esse questão em C++ usando a LISTA VETOR CIRCULAR.
Já implementei a BIBLIOTECA LISTA VETOR CIRCULAR:
#include <iostream>
#define tamanho 10
using namespace std;
struct LISTAC{
int inicio,fim,tam;
int item [tamanho];
};
void iniciaLista(LISTAC &l) {
l.inicio = 0,l.fim=0;
l.tam=0;
}
bool listaVazia(LISTAC l){
return l.tam==0;
}
bool listaCheia(LISTAC l){
return l.tam==tamanho;
}
void insereInicio(LISTAC &l, int x){
if(!listaCheia(l)){
if(listaVazia(l))
l.item[l.fim++]=x;
else{
if(l.inicio==0)
l.inicio=tamanho;
l.item[--l.inicio]=x;
}
l.tam++;
}
else
cout<<"lista cheia, nao insere inicio\n";
}
int removeInicio(LISTAC &l){
if(!listaVazia(l)){
int n=l.item[l.inicio++];
if(l.inicio==tamanho)
l.inicio=0;
l.tam--;
return n;
}
cout<<"lista vazia\n";
return -1;
}
void insereFim(LISTAC &l, int x){
if(!listaCheia(l)){
if(l.fim==tamanho)
l.fim=0;
l.item[l.fim++]=x;
l.tam++;
}
else
cout<<"lista cheia, nao insere no fim\n";
}
int removeFim(LISTAC &l){
if(!listaVazia(l)){
int n=l.item[--l.fim];
if (l.fim==0)
l.fim=tamanho;
l.tam--;
return n;
}
cout<<"lista vazia\n";
return -1;
}
void mostra(LISTAC l){
if(!listaVazia(l)){
if(l.fim>l.inicio)
for(int i=l.inicio;i<l.fim;i++)
cout<<l.item[i]<<' ';
else{
for(int i=l.inicio;i<tamanho;i++)
cout<<l.item[i]<<' ';
for(int i=0;i<l.fim;i++)
cout<<l.item[i]<<' ';
}
cout<<endl;
}
else
cout<<"lista vazia\n";
}
/*void mostra(LISTAC l){
if(!listaVazia(l)){
int pos=l.inicio;
cout<<l.item[pos++]<<' ';
while(pos!=l.fim){
if(pos==tamanho)
pos=0;
cout<<l.item[pos++]<<' ';
}
cout<<endl;
}
else
cout<<"lista vazia\n";
} */
A questão …
O algoritmo que remove um nó com base em sua ordem na lista circular usando vetor pode ser otimizado da seguinte forma: se o nodo a ser removido estiver localizado na primeira metade do vetor, o deslocamento deverá ser feito para baixo. Caso contrário o deslocamento deve ser feito para cima. Escreve o método otimizado que remove o no da posição passada como parâmetro.