您的位置:首页 > 其它

链表实现的多项式相加相乘

2009-12-24 22:09 513 查看
//* written by zhangge 2009.10.13 *//
//*modify by zhangge 2009 12.14*//
#include"iostream.h"
#include"stdlib.h"
class poly;
class node//定义节点类
{
friend class poly;
private:
int exp;
double ceof;
node *next;
public:
node(node *p=NULL)
{
next=p;
}
node(int a,double b,node *p=NULL)
{
exp=a;//指数
ceof=b;//系数
next=p;//链
}

};
class poly
{
private:
node *head;
public:
poly()
{
head=new node();
}
void insert(int a,double b)//插入操作
{
node *p=new node(a,b);
node *q;
q=head;
while(q->next!=NULL)
q=q->next;
q->next=p;
p->next=NULL;
}
void clearn()//clearn操作
{
head->next=NULL;
/*node *p,*t;
p=head->next;
head->next=NULL;
while(p!=NULL)
{
t=p;
p=p->next;
delete t;
}*/
}
void polyadd(poly po)
{
node *m,*n,*t,*k;
k=head;     //它用来指向m前一节点。以后定位用到。
m=head->next;
n=po.head->next;
while(m!=NULL&&n!=NULL)
{
if(m->exp<n->exp)
{
k=k->next;
m=m->next;
}
else if(m->exp==n->exp)
{
m->ceof+=n->ceof;
if(m->ceof!=0)
{
k=k->next;
m=m->next;
n=n->next;
}
else
{
t=m;
m=m->next;//这里要先于delete
k->next=m;//k要链上去。
delete t;
n=n->next;
}
}
else
{
t=n;
n=n->next;//这里注意循序,这个必须在这里,要不下面的操作将影响它。
t->next=k->next;
k->next=t;
k=k->next;
}
}
if(n!=NULL)//若po还有数据,就链上去
k->next=n;
}
void polymulty(poly po)
{
node *m,*n;
poly p2;
m=head->next;
head->next=NULL;//这里把其置空。
n=po.head->next;
while(n!=NULL)
{
insert(m->exp+n->exp,m->ceof*n->ceof);
n=n->next;
}
while(m->next!=NULL)//这里的判断条件注意不是m!=NULL
{
n=po.head->next;
m=m->next;
while(n!=NULL)
{
p2.insert(m->exp+n->exp,m->ceof*n->ceof);
n=n->next;
}
polyadd(p2);
p2.clearn();//这里要清空
}
}
void print()//打印
{
node *p;
p=head->next;
if(p==NULL)
cout<<0;
else
while(p!=NULL)
{
cout<<p->ceof<<"X"<<"^"<<p->exp<<" ";
p=p->next;
}
cout<<endl;
}
};
void main()
{
poly p1,p2;
int n,i,a,k;
double b;
loop:
cout<<"依次输入多项式的系数 (格式:系数,指数 按递增)"<<endl;
cout<<"	请输入第一个多项式的长度"<<endl;
cin>>n;
cout<<"输入多项式"<<endl;
for(i=0;i<n;i++)
{
cin>>b>>a;
p1.insert(a,b);
}
cout<<"请输入第二个多项式的长度"<<endl;
cin>>n;
cout<<"输入多项式"<<endl;
for(i=0;i<n;i++)
{
cin>>b>>a;
p2.insert(a,b);
}
cout<<"你想进行的计算"<<endl;
cout<<"1:加法"<<endl;
cout<<"2:乘法"<<endl;
cin>>k;
if(k==1)
{
p1.print();
p2.print();
p1.polyadd(p2);
p1.print();
p1.clearn();
p2.clearn();
}
else
{
p1.print();
p2.print();
p1.polymulty(p2);
p1.print();
p1.clearn();
p2.clearn();
}
cout<<"继续选1"<<endl;
cin>>k;
if(k==1)
goto loop;
else
exit(0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: