用单链表实现一维线性方程组的合并

来源:互联网 发布:申请域名注册备案平台 编辑:程序博客网 时间:2024/05/23 01:17
#include<iostream>
using namespace std;
template <class T>
struct Node
{
T data;
Node<T> *next;
};
template <class T>
class SingleList
{
private:
Node<T>* head;
public:
SingleList();
void insertData(T aData,T bData);
void insertEnd(T bData);
bool deleteData(T aData);
Node<T>* getHead();
void outputList();
~SingleList();
};
template <class T>
SingleList<T>::SingleList()
{
head=NULL;
}
template <class T>
void SingleList<T>::insertData(T aData,T bData)
{
Node<T> *p,*q,*s;
p=new Node<T>;
q=new Node<T>;
s=new Node<T>;
s->data=bData;
if(head==NULL)
{
head=s;
s->next=NULL;
return;
}
p=head;
if(p->data==aData)
{
head=s;
s->next=p;
}
else
{
while(p->data!=aData&&p->next!=NULL)
{
q=p;
p=p->next;
}
if(p->data==aData)
{
q->next=s;
s->next=p;
}
else
{
p->next=s;
s->next=NULL;
}
}
}
template <class T>
bool SingleList<T>::deleteData(T aData)
{
Node<T> *p,*q;
p=head;
if(p->data==aData)
{
head=p->next;
delete p;
return true;
}
else
{
q=new Node<T>;
while(p->data!=aData&&p->next!=NULL)
{
q=p;
p=p->next;
}
if(p->data==aData)
{
q->next=p->next;
delete p;
return true;
}
return false;
}
}
template <class T>
void SingleList<T>::insertEnd(T bData)
{
if(head==NULL)
{
Node<T>* HEAD=new Node<T>;
HEAD->data=bData;
head=HEAD;
HEAD->next=NULL;
}
else
{
Node<T>* current=head;
while(current->next!=NULL)
{
current=current->next;
}
Node<T>* NEW=new Node<T>;
NEW->data=bData;
current->next=NEW;
NEW->next=NULL;
}
}
template <class T>
Node<T>* SingleList<T>::getHead()
{
return head;
}
template <class T>
void SingleList<T>::outputList()
{
Node<T> *p;
p=head;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
template <class T>
SingleList<T>::~SingleList()
{
Node<T> *p,*q;
p=head;
while(p!=NULL)
{
q=p;
p=p->next;
delete q;
}
}


class Model
{
public:
Model();
Model(int xx,int yy);
int getX();
int getY();
void setX(int xx);
void setY(int yy);
void output();
bool operator == (Model b);
bool operator != (Model b);
private:
int x,y;
};
Model::Model()
{
x=0;
y=0;
}
Model::Model(int xx,int yy)
{
x=xx;
y=yy;
}
int Model::getX()
{
return x;
}
int Model::getY()
{
return y;
}
void Model::setX(int xx)
{
x=xx;
}
void Model::setY(int yy)
{
y=yy;
}
void Model::output()
{
cout<<"("<<getX()<<","<<getY()<<") ";
}
bool Model::operator ==(Model b)
{
if(getX()==b.getX()&&getY()==b.getY())
return true;
else
return false;
}
bool Model::operator !=(Model b)
{
if(getX()==b.getX()&&getY()==b.getY())
return false;
else
return true;
}
template <class T>
class Single:public SingleList<T>
{
public:
Single();
void add(Single<T> &b);
void insert(T mod);
void output();
};
template <class T>
Single<T>::Single():SingleList<T>()
{
cout<<"Single created. "<<endl;
}
template <class T>
void Single<T>::add(Single<T> &b)
{
Node<T>* head1=new Node<T>;
Node<T>* head2=new Node<T>;
head1=getHead();
head2=b.getHead();
while(head1!=NULL&&head2!=NULL)
{
if(head1->data.getY()<head2->data.getY())
{
head1=head1->next;
}
else if(head1->data.getY()>head2->data.getY())
{
insertData(head1->data,head2->data);
Node<T>* next=head2->next;
b.deleteData(head2->data);
head2=next;
}
else if(head1->data.getY()==head2->data.getY())
{
Node<T>* tem1=new Node<T>;
Node<T>* tem2=new Node<T>;
if(head1->data.getX()+head2->data.getX()!=0)
{
head1->data.setX(head1->data.getX()+head2->data.getX());
head1=head1->next;
tem1=head2->next;
b.deleteData(head2->data);
head2=tem1;
}
else
{
tem1=head1->next;
tem2=head2->next;
deleteData(head1->data);
b.deleteData(head2->data);
head1=tem1;
head2=tem2;
}
}
}
while(head2!=NULL)
{
Node<T>* tem;
tem=head2->next;
insertEnd(head2->data);
b.deleteData(head2->data);
head2=tem;
}
}
template <class T>
void Single<T>::insert(T mod)
{
insertEnd(mod);
}
template <class T>
void Single<T>::output()
{
Node<T>* head=getHead();
T model;
while(head!=NULL)
{
model=head->data;
model.output();
head=head->next;
}
}
int main()
{
Model a(2,3),b(3,4),c(4,5),d(5,6),e(1,2),f(-3,4),g(8,9);
Single<Model> single1;
Single<Model> single2;
single1.insert(a);
single1.insert(b);
single1.insert(c);
single1.insert(d);
single2.insert(e);
single2.insert(f);
single2.insert(g);
single1.add(single2);
single1.output();
return 0;
}
0 0
原创粉丝点击