ciao ragazzi, ho creato una calsse (listap) che implementa le liste con i puntatori, circolari e con sentinella però è evidente che c'è un problema nel metodo inslista. in pratica quando vienne inserito nella lista il primo nodo (dopo la sentinella) ho il seguente problema: il puntatore all'elemento precedente della sentinella non punta al nuovo elemento inserito ma alla sentinella stessa, mentre il puntatore all'elemento successivo dell'elemento inserito non punta alla sentinella ma a se stesso. io non riesco a capire dove sia il problema. chi mi aiuta a capire meglio???
posto il codice della classe e il codice che ho scritto per provare se la classe è stata creata correttamente:
listap.h
codice:
#ifndef _LISTAP_H
#define _LISTAP_H
#include <iostream>
using namespace std;
typedef int tipoelem;
struct nodo
{
nodo *precedente;
tipoelem elemento;
nodo *successivo;
};
typedef nodo *posizione;
class listap
{
public:
posizione sentinella;
listap();
void crealista();
bool listavuota();
posizione primolista();
bool finelista(posizione);
void inslista(posizione &, tipoelem);
void canclista(posizione &);
tipoelem leggilista(posizione);
void scrivilista(posizione &, tipoelem);
posizione predlista(posizione);
posizione succlista(posizione);
};
#endif
listap.cpp
codice:
#include "listap.h"
listap::listap()
{
crealista();
}
void listap::crealista()
{
sentinella = (posizione)malloc(sizeof(nodo));
tipoelem elemnullo = 0;
sentinella->precedente = sentinella;
sentinella->elemento = elemnullo;
sentinella->successivo = sentinella;
}
bool listap::listavuota()
{
return((sentinella->precedente == sentinella) && (sentinella->successivo == sentinella));
}
posizione listap::primolista()
{
if(!listavuota())
{
return(sentinella->successivo);
}
cerr << "la lista e\' vuota\n\n";
}
bool listap::finelista(posizione p)
{
return(p->successivo == sentinella);
}
void listap::inslista(posizione &p, tipoelem elem)
{
posizione temp = new nodo;
temp->elemento = elem;
temp->precedente = p->precedente;
temp->successivo = p;
p->precedente->successivo = temp;
p->precedente = temp;
p = temp;
}
void listap::canclista(posizione &p)
{
posizione temp = p;
p->precedente->successivo = p->successivo;
p->successivo->precedente = p->precedente;
p = p->successivo;
delete(temp);
}
tipoelem listap::leggilista(posizione p)
{
return(p->elemento);
}
void listap::scrivilista(posizione &p, tipoelem elem)
{
p->elemento = elem;
}
posizione listap::predlista(posizione p)
{
return(p->precedente);
}
posizione listap::succlista(posizione p)
{
return(p->successivo);
}
provalistap.cpp
codice:
#include <cstdlib>
#include <iostream>
#include "listap.h"
using namespace std;
int main(int argc, char *argv[])
{
listap list;
list.inslista(list.sentinella, 1);
cout << list.listavuota() << "\n\n";
system("pause");
system("cls");
cout << list.succlista(list.sentinella) << "\n";
cout << list.succlista(list.sentinella)->precedente << " " << list.succlista(list.sentinella)->successivo << "\n\n";
cout << list.sentinella << "\n";
cout << list.sentinella->precedente << " " << list.sentinella->successivo << "\n\n";
system("pause");
system("cls");
system("PAUSE");
return EXIT_SUCCESS;
}