#include "iostream.h"
#include "string.h"
template
struct NODE
{
TYPE data;
NODE *next,*prev;
};
template
class List
{
private:
NODE *head;
NODE *pos;
NODE *rear;
int count;
void StartHead();
int Finish();
void StartRear();
void SkipNext();
void SkipPrev();
void Insert(TYPE DataIn,NODE *p);
void Remove(NODE *p);
public:
List();
~List();
int Count();
void GetData(TYPE &DataOut);
void InsertHead(TYPE DataIn);
void InsertRear(TYPE DataIn);
void RemoveAll();
void Input(void (*in)(TYPE &));
void Print(void (*out)(TYPE));
void Add2List(List &ListOne,List &ListTwo);
};
template
List::List()
{
head=rear=pos=NULL;
count=0;
}
template
List::~List()
{}
//------------- bat dau ---------------------------
template
void List::StartHead()
{
pos=head;
}
template
void List::StartRear()
{
pos=rear;
}
//---------------ket thuc ? -------------------
template
int List::Finish()
{
return pos==NULL;
}
//----------------nhay -----------------------
template
void List::SkipNext()
{
pos=pos->next;
}
template
void List::SkipPrev()
{
pos=pos->prev;
}
//---------------lay du lieu ------------------
template
void List::GetData(TYPE &DataOut)
{
memcpy(&DataOut,&pos->data,sizeof(TYPE));
}
//---------------chen -------------------------
template
void List::Insert(TYPE DataIn,NODE *p)
{
NODE *q;
NODE *pnew=new NODE;
memcpy(&pnew->data,&DataIn,sizeof(TYPE));
if(p==NULL)
q=head;
else
q=p->next;
pnew->next=q;
if(p==NULL)
head=pnew;
else
p->next=pnew;
pnew->prev=p;
if(q==NULL)
rear=pnew;
else
q->prev=pnew;
count++;
}
//-----------------chen vao dau ----------------
template
void List::InsertHead(TYPE DataIn)
{
Insert(DataIn,NULL);
}
//----------------chen vao duoi-----------------
template
void List::InsertRear(TYPE DataIn)
{
Insert(DataIn,rear);
}
//----------------xoa -----------------------
template
void List::Remove(NODE *p)
{
NODE *ptmp,*q;
if(p==NULL)
ptmp=head;
else
ptmp=p->next;
q=ptmp->next;
if(p==NULL)
head=q;
else
p->next=q;
if(q==NULL)
rear=p;
else
q->prev=p;
delete ptmp;
count--;
}
//----------------xoa ds----------------------
template
void List::RemoveAll()
{
while(head!=NULL)
{
Remove(NULL);
}
}
//----------------nhap ----------------------
template
void List::Input(void (*in)(TYPE &))
{
int n;
TYPE x;
cout << "Nhap vao so phan tu :";
cin >> n;
for (int i=0;i {
cout <<"nhap ptu thu "< in(x);
InsertRear(x);
}
}
//----------------in ----------------------
template
void List::Print(void (*out)(TYPE))
{
TYPE x;
StartHead();
while(!Finish())
{
GetData(x);
out(x);
SkipNext();
}
cout << endl ;
}
//----------------cong so nguyen lon---------------
template
void List::Add2List(List &ListOne,List &ListTwo)
{
TYPE Carry,x;
Carry=0;
ListOne.StartRear();
ListTwo.StartRear();
while(!ListOne.Finish() && !ListTwo.Finish())
{
Carry=Carry + ListOne.pos->data + ListTwo.pos->data;
x=Carry % 10 ;
InsertHead(x);
Carry=Carry/10 ;
ListOne.SkipPrev();
ListTwo.SkipPrev();
}
while(!ListOne.Finish())
{
Carry=Carry + ListOne.pos->data;
x=Carry % 10 ;
InsertHead(x);
Carry=Carry/10 ;
ListOne.SkipPrev();
}
while(!ListTwo.Finish())
{
Carry=Carry + ListTwo.pos->data;
x=Carry % 10 ;
InsertHead(x);
Carry=Carry/10;
ListTwo.SkipPrev();
}
if(Carry > 0)
InsertHead(Carry);
}
void NhapSoNguyen(int &n)
{
cin >> n ;
}
void XuatSoNguyen(int n)
{
cout << n ;
}
void main()
{
List L;
List LOne;
List LTwo;
LOne.Input(NhapSoNguyen);
LOne.Print(XuatSoNguyen);
LTwo.Input(NhapSoNguyen);
LTwo.Print(XuatSoNguyen);
L.Add2List(LOne,LTwo);
cout <<"-------------------" << endl ;
L.Print(XuatSoNguyen);
}