ciao a tutti, ho implementato la struttura dati grafo con la lista delle adiacenze. nel metodo insarco c'è un'istruzione che dà errore. posto il codice del metodo:
grafola.h
l'errore che mi viene visualizzato è il seguente:codice:#ifndef grafolla_h #define grafolla_h #include<iostream> #include<stdlib.h> #include<assert.h> #include"listap.h" using namespace std; template<class tipoelem> class grafolla { public: typedef struct nodoad { char etichetta[15]; int cursore; int peso; } adiacente; typedef struct Nodo { char etichetta[15]; int posizione; tipoelem valore; listap<struct nodoad> *adiacent; } nodo; grafolla(); void creagrafo(); bool grafovuoto(); void insnodo(nodo); void insarco(nodo, nodo); void cancnodo(nodo); void cancarco(nodo, nodo); listap<struct Nodo> adiacenti(nodo); bool esistenodo(nodo); bool esistearco(nodo, nodo); tipoelem legginodo(nodo); void scrivinodo(nodo, tipoelem); int leggiarco(nodo, nodo); void scriviarco(nodo, nodo, int); private: nodo *nodi; int numnodi; }; #endif template<class tipoelem> grafolla<tipoelem>::grafolla() { this->creagrafo(); } template<class tipoelem> void grafolla<tipoelem>::creagrafo() { nodi = NULL; numnodi = 0; } template<class tipoelem> bool grafolla<tipoelem>::grafovuoto() { return(numnodi == 0); } template<class tipoelem> void grafolla<tipoelem>::insnodo(typename grafolla<tipoelem>::nodo node) { //assert(!this->esistenodo(node)); numnodi++; nodo *noditmp = new struct Nodo[numnodi]; if(numnodi > 1) { for(int i = 0; i < numnodi - 1; i++) noditmp[i] = nodi[i]; delete[] nodi; } cout << "inserire l'etichetta del nodo: "; cin >> node.etichetta; cout << "inserire il valore del nodo: "; cin >> node.valore; node.adiacent = NULL; node.posizione = numnodi - 1; noditmp[numnodi - 1] = node; nodi = noditmp; } template<class tipoelem> void grafolla<tipoelem>::insarco(typename grafolla<tipoelem>::nodo n1, typename grafolla<tipoelem>::nodo n2) { assert(this->esistenodo(n1) && this->esistenodo(n2) && !this->esistearco(n1, n2)); adiacente a; a.etichetta = n2.etichetta; a.cursore = n2.posizione; listap<struct nodoad> *l = nodi[n1.posizione].adiacent; l->inslista(l->predlista(l->primolista()), a); } template<class tipoelem> void grafolla<tipoelem>::cancnodo(typename grafolla<tipoelem>::nodo node) { assert(this->esistenodo(node)); //eliminazione degli archi (adiacenze) uscenti bool trovato = false; int i = 0; while(!trovato) { if(nodi[i].etichetta == node.etichetta) { listap<struct nodoad> *l = nodi[i].adiacent; while(!l->listavuota()) l->canclista(l->primolista()); trovato = true; } else i++; } //eliminazione degli archi (adiacenze) entranti for(int k = 0; k < numnodi; k++) { if(this->esistearco(nodi[k], node)) this->cancarco(nodi[k], node); else k++; } //modifica del vettore dei nodi nodo *noditmp = new struct Nodo[numnodi - 1]; int j; for(j = 0; j < i; j++) noditmp[j] = nodi[j]; j = i + 1; for(j = i + 1; j < (numnodi - 1); j++) { noditmp[j - 1] = nodi[j]; noditmp[j - 1].posizione -= 1; } nodi = noditmp; numnodi -= 1; } template<class tipoelem> void grafolla<tipoelem>::cancarco(typename grafolla<tipoelem>::nodo n1, typename grafolla<tipoelem>::nodo n2) { assert(this->esistenodo(n1) && this->esistenodo(n2) && this->esistearco(n1, n2)); listap<struct nodoad> *l = nodi[n1.posizione].adiacent; typename listap<struct nodoad>::posizione p = l->primolista(); bool trovato = false; while(!trovato && (p != l->predlista(l->primolista()))) { if(l->leggilista(p).etichetta == n2.etichetta) { l->canclista(p); trovato = true; } else p = l->suclista(p); } } template<class tipoelem> listap<typename grafolla<tipoelem>::nodo> grafolla<tipoelem>::adiacenti(typename grafolla<tipoelem>::nodo node) { assert(this->esistenodo(node)); listap<struct Nodo> lis; if(nodi[node.posizione].adiacent != NULL) { listap<nodoad> l = *nodi[node.posizione].adiacent; typename listap<nodoad>::posizione p = l.primolista(); while(p != l.predlista(l.primolista())) { lis.inslista(lis.predlista(lis.primolista()), nodi[l.leggilista(p).cursore]); p = l.suclista(p); } } return lis; } template<class tipoelem> bool grafolla<tipoelem>::esistenodo(typename grafolla<tipoelem>::nodo node) { bool esito = false; int i = 0; while(!esito && (i < numnodi)) { if(nodi[i].etichetta == node.etichetta) esito = true; else i++; } return esito; } template<class tipoelem> bool grafolla<tipoelem>::esistearco(typename grafolla<tipoelem>::nodo n1, typename grafolla<tipoelem>::nodo n2) { assert(this->esistenodo(n1) && this->esistenodo(n2)); listap<nodoad> *l = nodi[n1.posizione].adiacent; typename listap<nodoad>::posizione p = l.primolista(); bool trovato = true; while(!trovato && (p != l->predlista(l->primolista()))) { if(l->leggilista(p).etichetta == nodi[n2.posizione].etichetta) trovato = true; else p = l->suclista(p); } return trovato; } template<class tipoelem> tipoelem grafolla<tipoelem>::legginodo(typename grafolla<tipoelem>::nodo node) { assert(this->esistenodo(node)); return(nodi[node.posizione].valore); } template<class tipoelem> void grafolla<tipoelem>::scrivinodo(typename grafolla<tipoelem>::nodo node, tipoelem elem) { assert(this->esistenodo(node)); nodi[node.posizione].valore = elem; } template<class tipoelem> int grafolla<tipoelem>::leggiarco(typename grafolla<tipoelem>::nodo n1, typename grafolla<tipoelem>::nodo n2) { assert(this->esistearco(n1, n2)); listap<nodoad> *l = nodi[n1.posizione].adiacent; typename listap<nodoad>::posizione p = l->primolista(); bool trovato = false; while(!trovato && (p != l->predlista(l->primolista()))) { if(l->leggilista(p).etichetta == n2.etichetta) trovato = true; else p = l->suclista(p); } return(l->leggilista(p).peso); } template<class tipoelem> void grafolla<tipoelem>::scriviarco(typename grafolla<tipoelem>::nodo n1, typename grafolla<tipoelem>::nodo n2, int pes) { assert(!this->esistearco(n1, n2)); listap<nodoad> *l = nodi[n1.posizione].adiacent; typename listap<nodoad>::posizione p = l->primolista(); bool trovato = false; while(!trovato && (p != l->predlista(l->primolista()))) { if(l->leggilista(p).etichetta == n2.etichetta) { nodoad n = l->leggilista(p); n.peso = pes; l->scrivilista(p, n); trovato = true; } else p = l->suclista(p); } }
101 C:\Dev-Cpp\Strutture\Grafi\grafolla.h ISO C++ forbids assignment of arrays
perchè??? da quando in qua è proibito fare un assegnamento in un campo di un record??

Rispondi quotando