Possible there are many errors...
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
#define u32 unsigned
#define i32 int
#define S sizeof
#define R return
#define F for
#define MM malloc
#define FF free
#define ooo cout
// Nodo generale rNode<T> di tipo T
template<class T> class rNode{
public:
T nd; // nd: valore del tipo conservato nel nodo
u32 nrd; // nrd: valore associato alla lista a cui appartiene
rNode* next; // puntatore al nodo successivo
rNode* prec; // puntatore al nodo precedente
};
//tList: Linked Lista doppia di rNode<T> di tipo T
template<class T> class rList{
public:
rNode<T>* pnd; // Punta al nodo iniziale per inserimento all'inizio
u32 err; // err=1 allora l'obj e' in errore
u32 rnd; // ogni lista ha il suo valore random per controllare meglio la rimozione o inserimento dopo nodo, di nodi
u32 sz; // size in numero di nodi della lista
static u32 t0; // srand(time(0)) has to be only 1 time;
// at start is t0=0 when the first list is build: srand(time(0)), t0=1, any other list creation use only rand()
// and not srand()
//-----------------------------
//--- costruttori e distruttori
//lista **non inazializzata** e' in stato di errore err=1
//NB: **Qualsiasi operazione di assegnamento cambia lo stato della lista in err=0 [nessun errore]**
rList(){u32 r;pnd=0;err=1;if(t0==0){r=time(0);srand(r);t0=1;}rnd=rand();sz=0;}
rList(T* p,u32 s)
{u32 i, r;
rNode<T>*v,*w;
if(t0==0){r=time(0);srand(r);t0=1;}
pnd=0;err=1;rnd=rand();sz=0;
if(p==0||s==0)
if(s){ooo<<"\nArgomenti del costruttore non buoni\n"; R;}
else R;
if((int)s<0)
{ooo<<"\nArgomenti del costruttore non buoni\n"; R;}
F(i=0;i<s;++i)
{if( (v=(rNode<T>*)MM(S(rNode<T>)))==0 )
{ooo<<"\nErrore memoria non sufficiente\n";
(*this).removeHead(0); R;
}
if(pnd==0){pnd=v;v->next=0;v->prec=0;}
else {w=pnd;pnd=v;
v->next =w;
v->prec =w->prec?w->prec:w;
w->prec =v;
}
v->nd =p[s-i-1]; // array pushed reverse i=0=>s-1 ok; i=s-1 =>s-i-1=s-s+1-1=0 ok
v->nrd=rnd;
++sz;
}
err=0;
}
~rList()
{rNode<T>*p,*w;
u32 led;
F(led=err,p=pnd;p;p=w)
{w=p->next;if(p->nrd==rnd){FF(p);--sz;}else led=1;}
if(sz||(led&&pnd))
{ooo<<"\nErrore distruttore Lista="<<this<<"\n";}
pnd=0;err=0;rnd=0;sz=0;
}
//--- funzione accesso array [per accedere all'elemento Lista[i] deve percorre i nodi della lista]
//se indice fuori del range >=sz allora exit(1)
T& operator[](i32 n)
{rNode<T> *p,*w;
i32 i;
static T r; // the constructor of the type build r as error element for T
if(err) R r;
if(n<0||n>=sz){ooo<<"\nIndice Fuori range\n";R r;} // questo non invalida la lista, r e' l'elemento non inizializzato
F(i=0,w=0,p=pnd;i<n&&p;++i,w=p,p=p->next);
R p->nd;
}
//--- funzioni elemento
void insertHead(T& e)
{rNode<T>*v,*p;
if(err&&pnd){ooo<<"\nInsert Non Riuscito\n"; R;}
if( (v=(rNode<T>*)MM(S(rNode<T>)))==0 )
{err=1;ooo<<"\nInsert Non Riuscito\n";R;}
if(pnd==0){pnd=v;err=0;v->next=0;v->prec=0;}
else {p=pnd;pnd=v;
v->next =p;
v->prec =p->prec?p->prec:p;
p->prec =v;
}
v->nrd=rnd;
v->nd =e; ++sz;
}
//--- lista.removeHead(0) --rimuove ogni elemento della lista, err=1 non inizializata
// lista.removeHead(&r) --salva in r l'elemento del nodo puntato da pnd
// elimina tale nodo dalla lista
int removeHead(T*r)
{rNode<T>*p,*w;
u32 led;
if(r==0) // cancell the list if r==0, even if err=1
{F(led=err,p=pnd;p;p=w)
{w=p->next;if(p->nrd==rnd){FF(p);--sz;}else led=1;}
err=1;
if(sz||(led&&pnd))
{pnd=0;sz=0;ooo<<"\nErrore distruttore Lista="<<this<<"\n";R 0;}
pnd=0;sz=0; // rnd e' lasciato, err=1 perche' la lista non inizializzata
R 1;
}
if(pnd==0||err)R 0;
if(pnd->nrd!=rnd){err=1;R 0;}
*r=pnd->nd;
p=pnd->next;
w=pnd->prec;
if(p->nrd==rnd){FF(pnd);--sz;pnd=p;p->prec=w;}
else {err=1;R 0;}
if(pnd==0&&sz==0)err=1; //lista non inizializzata
if(pnd!=0&&sz==0)err=1; // si e' accorto di un errore
R !err;
}
//--- funzioni insert remove
void insertTail(T& e)
{rNode<T>*v,*p;
if(err&&pnd){ooo<<"\nInsert Non Riuscito\n"; R;}
if( (v=(rNode<T>*)MM(S(rNode<T>)))==0 )
{err=1;ooo<<"\nInsert Non Riuscito\n";R;}
if(pnd==0){pnd=v;err=0;v->next=0;v->prec=0;}
else {p=pnd->prec?pnd->prec:pnd;
// solo un nodo pnd->v p=pnd
// pnd->..->w->v p=w
p->next=v; v->prec=p;
v->next=0;pnd->prec=v;
}
v->nrd=rnd;v->nd=e; ++sz;
}
//--- lista.removeTail(0) --rimuove ogni elemento della lista, err=1 non inizializata
// lista.removeTail(&r) --salva in r l'elemento del nodo puntato da pnd
// elimina tale nodo dalla lista
int removeTail(T*r)
{rNode<T>*p,*w;
if(r==0)R!err;
if(pnd==0||err)R 0;
//pnd->..->w->p
p =pnd->prec?pnd->prec:pnd;
if(p->nrd!=rnd){err=1;R 0;}
w = p->prec;
*r= p->nd;
if(w){ w->next=0;
pnd->prec=w;
}
FF(p);--sz;
if(pnd==0&&sz==0)err=1; //lista non inizializzata
if(pnd!=0&&sz==0)err=1; // si e' accorto di un errore
R !err;
}
int insertAfter(rNode<T>*p, T& a)
{rNode<T>*p,*v,*w;
if((err!=0&&pnd!=0)||(p==0&&pnd!=0)||p->nrd!=rnd)
{ooo<<"\nInsert Non Riuscito\n"; err=1; R 0;}
if(p==0&&pnd==0) R (*this).insertHead(a);
w=p->next;
if(w==0) R (*this).insertTail(a);
if( (v=(rNode<T>*)MM(S(rNode<T>)))==0 )
{err=1;ooo<<"\nInsert Non Riuscito\n"; R 0;}
v->prec=p; v->next=w;p->next=v;w->prec=v;
v->nrd =rnd;v->nd =a; ++sz;
}
void print(void)
{rNode<T>*p;
if(err){ooo<<"[List error]"; R;}
ooo<<"[";
F(p=pnd;p;)
{ooo<<p->nd;
if(p->nrd!=rnd){ooo<<"*"; err=1;}
if(p=p->next)ooo<<", ";
}
ooo<<"] ";
if(err)ooo<<"Trovato errore ";
}
void printRev(void)
{rNode<T>*p;
if(err){ooo<<"[List error]"; R;}
ooo<<"[";
if(pnd)
for(p=pnd->prec;p;)
{ooo<<p->nd;
if(p->nrd!=rnd){ooo<<"*"; err=1;}
if(p==pnd)break;
ooo<<", ";
p=p->prec;
}
ooo<<"] ";
if(err)ooo<<"Trovato errore ";
}
int e(void){R err;}
// Operatori friend
// moltiplica due liste fino a che la size di entrambi lo permette
friend T operator*(const rList& a, const rList& b)
{static T r; //r should be initalizated to err object
rNode<T>*pa,*pb;
if(a.err||b.err)R r;
F(r=0,pa=a.pnd,pb=b.pnd;pa&&pb;pa=pa->next,pb=pb->next)
r+=(pa->nd)*(pb->nd);
R r;
}
}; //fine classe rList<T>
template<class T> u32 rList<T>::t0=0; // sembra che qui si genera lo spazio per l'obj t0
int mainx(void)
{int i,r;
rList<int> lista;
for(i=0;i<10;++i)
lista.insertTail(i);
ooo<<"lista=";lista.print();ooo<<"\n";
ooo<<"lista=";lista.printRev();ooo<<"\n";
r=lista.removeTail(&i);
ooo<<"i,r="<<i<<", "<<r<<"\n";
ooo<<"lista=";lista.print();ooo<<"\n";
ooo<<"lista=";lista.printRev();ooo<<"\n";
R 0;
}
int main(void)
{int arr[]={0,0,7,0,5,0,0,8,0,4}, r;
int ar1[]={0,0,0,5,6,0,0,0,0,5};
u32 i;
rList<int> la(arr, S arr/S(int));
rList<int> l1(ar1, S ar1/S(int));
ooo<<"la=";la.print();ooo<<"\n";
ooo<<"l1=";l1.print();ooo<<"\n";
ooo<<"la=";la.printRev();ooo<<"\n";
r=la*l1;
ooo<<"Result: la*lb="<<r<<"\n";
// try to use vector way [], that it is not O(1) as vector and array