PDA

Visualizza la versione completa : [C++] Realizzazione lista con cursori


pietrol83
07-11-2011, 11:30
ciao a tutti, sto realizzando la struttura dati lista con i cursori, una via di mezzo tre realizzazione con vettore e con puntatore. sono ancora all'inizio e ho creato il costruttore e il metodo crealista. facendo il test per vedere se l'oggetto viene creato mi dà errore. posto i codici.

listac.h


#ifndef listac_h
#define listac_h

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

using namespace std;

const int lungvet = 100;

template<class tipoelem>
class listac
{
public:
typedef int posizione;
listac();
void crealista();
private:
struct nodo
{
posizione precedente;
tipoelem elemento;
posizione successivo;
};
static nodo spazio[lungvet];
static posizione listalibera;
int lunglistalibera;
posizione lista;

void inizializzalistalibera()
{
for(int i = 0; i < (lungvet - 1); i++)
{
if(i == 0)
{
spazio[i].precedente = lungvet - 1;
spazio[i].successivo = i + 1;
}
else
{
spazio[i].precedente = i - 1;
spazio[i].successivo = i + 1;
}
}
spazio[lungvet - 1].precedente = lungvet - 2;
spazio[lungvet - 1].successivo = 0;
listalibera = 0;
}

};

#endif

template<class tipoelem>
listac<tipoelem>::listac()
{
this->crealista();
}

template<class tipoelem>
void listac<tipoelem>::crealista()
{
lista = listalibera;
listalibera = spazio[listalibera].successivo;
spazio[listalibera].precedente = spazio[lista].precedente;
spazio[lista].precedente = lista;
spazio[lista].successivo = lista;
}


testlistac.cpp


#include "listac.h"
#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
listac<int> list;

system("pause");
return 0;
}


gli errori che mi vengono visualizzati sono i seguenti:
[Linker error] undefined reference to `listac<int>::listalibera'
[Linker error] undefined reference to `listac<int>::listalibera'
[Linker error] undefined reference to `listac<int>::spazio'
[Linker error] undefined reference to `listac<int>::listalibera'
[Linker error] undefined reference to `listac<int>::listalibera'
[Linker error] undefined reference to `listac<int>::spazio'
[Linker error] undefined reference to `listac<int>::spazio'
[Linker error] undefined reference to `listac<int>::spazio'
[Linker error] undefined reference to `listac<int>::spazio'

cosa devo correggere???

pietrol83
09-11-2011, 10:41
ciao a tutti, sono riuscito a creare la struttura dati lista mediante i cursori. in pratica la struttura viene compilata correttamente però il test va in crash. ecco i codici da me creati:

listacur.h


#ifndef listacur_h
#define listacur_h

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

using namespace std;
const int dimvettore=100;

template <class tipoelem> //classe tempalate per la lista
class listacur
{
typedef int pos;

public:
listacur();
void crealista();
/*bool listavuota();
tipoelem leggilista (pos);
void scrivilista (tipoelem,pos);
pos primolista();
bool finelista (pos);
pos suclista (pos);
pos predlista(pos);
void inslista (tipoelem,pos);
void canclista (pos);*/

private:

typedef struct cella { //struttura elemento lista
tipoelem elem;
int prec;
int succ; } cella;
int lunglista;

static cella *spazio;
static pos listalibera;
pos lista;
static bool inizializzato;

static cella * inizializza();

};
#endif

template<class tipoelem>
typename listacur<tipoelem>::cella *listacur<tipoelem>::inizializza()
{
if (!inizializzato)
{
spazio[0].prec= dimvettore-1;
spazio[0].succ= 1;
for (int i=1;i<dimvettore;i++)
{
spazio[i].prec=(i-1)%dimvettore;
spazio[i].succ=(i+1)%dimvettore;
}
inizializzato=true;
return(spazio);
}
}

template<class tipoelem>
typename listacur<tipoelem>::cella *listacur<tipoelem>::spazio = listacur<tipoelem>::inizializza();

template<class tipoelem>
typename listacur<tipoelem>::pos listacur<tipoelem>::listalibera = 0;

template <class tipoelem> //INIZIALIZZATO
bool listacur<tipoelem>::inizializzato=false;

template <class tipoelem>
listacur<tipoelem>::listacur() //COSTRUTTORE
{
crealista();
}

template <class tipoelem>
void listacur<tipoelem>::crealista() //CREALISTA
{
lista=listalibera;
spazio[lista].prec=lista;
spazio[lista].succ=lista;
listalibera=spazio[listalibera].succ;
}


testlistacur.cpp


#include "listacur.h"
#include <stdlib.h>
#include <iostream>

using namespace std;

int main()
{
listacur<int> lista;
system ("PAUSE");
return 0;
}


come detto prima, il test va in crash. dove ho sbagliato???
sperando che qualcuno risponda vi saluto e vi auguro una buona giornata.

oregon
09-11-2011, 10:58
Va in crash nella linea

spazio[0].prec= dimvettore-1;

perché spazio[0] non esiste (non è stato mai allocato).

pietrol83
09-11-2011, 11:13
grazie 1000 oregon!!!

Loading