一元多项式的加减乘数实现

来源:互联网 发布:淘宝可以买到美沙酮吗 编辑:程序博客网 时间:2024/05/16 01:31

之前,简单地实现了多项式的打印和加法。

这次我很详细地完善了之前的,增加了减法,乘法还有最最最重要的!!!除法!!!

这里就大概说下我的思路:

因为懒得重新写结构了,我就直接引用之前的DbList。并且增加了一个数据域,也就是说有两个数据域,一个存放系数,一个存放指数。这就构成了多项式的每一项了。

尾插函数(push_back):每输入一项的系数和指数的时候就构成了一个结点,将它尾部插入。这样就构成了一条多项式的链。

排序函数(sort):按照指数由高到低的顺序将多项式进行排序(注意一定要由高到低,不然的话进行除法运算的时候不好操作)

合并函数(listcom):由于我们输入的时候可能会输入两个指数相同的项,这时候就需要把他们进行合并下。

打印函数(show_list):多项式的打印可是很有讲究的哦:{系数为1,不打印系数。指数为1,不打印指数。指数为0,只打印系数。还有+和-的符号打印。}

加:

两个指针分别指两个多项式,进行比较:若遇到指数相同的,将其系数进行相加。若不相同,将指数小的那一项尾部插入到和的后面,而大的那个指针不动。直到有一个多项式结束了。最后再把没有结束的那部分全部尾部插入到和里面去。

减:

主要思想和加相似,这里我就不多说。

乘:

两个指针分别指向两个多项式,两个while嵌套,第一个式子中的每一项去乘第二个式子中的每一项,所得乘积求和。

除:


废话不多说,上代码咯...

#include"AllHead.h"
class DbList;
class DbListNode
{
friend class DbList;
private:
DbListNode *pre;
DbListNode *next;
int exp;
float coef;
public:
DbListNode(DbListNode *pt = NULL,DbListNode *nt = NULL)
{
pre = pt;
next = nt;
}
DbListNode(float y,int x,DbListNode *pt = NULL,DbListNode *nt = NULL)
{
coef = y;
exp = x;
pre = pt;
next = nt;
}
};


class DbList
{
private:
DbListNode *begin;
DbListNode *end;
size_t        size;
public:
DbList()
{
begin = new DbListNode;
end = begin;
begin->pre = end;
end->next = begin;
size = 0;
}
~DbList(){makeEmpty();}
Status push_back(float y,int x);
void show_dblist();
void makeEmpty();
Status IsEmpty(){return begin == end?TRUE:FALSE;}
void sort();
void listcom();//合并
void listadd(DbList *y1,DbList *y2);
void listsub(DbList *y1,DbList *y2);
void listmul(DbList *y1,DbList *y2);
//多项式除法,结果有商和余。
void listdiv(DbList *y1,DbList *y2,DbList &save);
void Copy(DbList *y1);//写一个简易的拷贝函数。只是为了保留上一次temp的这个项式。

};
void DbList::Copy(DbList *y1)
{
if(y1 == NULL)
{
cout<<"空项式...(copy)"<<endl;
}
else
{
DbListNode *p1 = y1->begin->next;
while(p1!=y1->begin)
{
push_back(p1->coef,p1->exp);
p1 = p1->next;
}
}
}
void DbList::listdiv(DbList *y1,DbList *y2,DbList &save)
{
float tempcoef;
float tempcoef1;
int tempexp1;
int tempexp;
DbListNode *p1 = y1->begin->next;
DbListNode *p2 = y2->begin->next;
DbListNode *ptemp = p1;
DbList temp;
DbList remtemp;
remtemp.Copy(y1);
while(p2->exp <= ptemp->exp)
{
//save.makeEmpty();
tempcoef = ptemp->coef/p2->coef;
tempexp = ptemp->exp - p2->exp;
push_back(tempcoef,tempexp);
while(p2!=y2->begin)
{
tempcoef1 = tempcoef*p2->coef;
tempexp1 = tempexp+p2->exp;
save.push_back(tempcoef1,tempexp1);
p2 = p2->next;
}
p2 = p2->next;
temp.listsub(&remtemp,&save);
remtemp.makeEmpty();
remtemp.Copy(&temp);
ptemp = remtemp.begin->next;
temp.makeEmpty();
save.makeEmpty();
}
save.Copy(&remtemp);
}
void DbList::listmul(DbList *y1,DbList *y2)
{
float tempcoef;
int tempexp;
DbListNode *p1 = y1->begin->next;
DbListNode *p2 = y2->begin->next;
while(p2 != y2->begin)
{
while(p1 != y1->begin)
{
tempcoef = p1->coef * p2->coef;
tempexp = p1->exp + p2->exp;
push_back(tempcoef,tempexp);
p1 = p1->next;
}
p1 = p1->next;
p2 = p2->next;
}
}
void DbList::listcom()
{
if(IsEmpty())
{
cout<<"空项式"<<endl;
}
else
{
sort();
DbListNode *p = begin->next;
DbListNode *h = p->next;
while(h!=begin)
{
if(h->exp != p->exp)
{
p = p->next;
h = p->next;
}
else
{
p->coef = p->coef+h->coef;
p->next = h->next;
delete h;
h = p->next;
}
}
}
}
void DbList::listsub(DbList *y1,DbList *y2)
{
float temp;
DbListNode *p1 = y1->begin->next;
DbListNode *p2 = y2->begin->next;
DbListNode *p;
while(p1!=y1->begin && p2!= y2->begin)
{
if(p1->exp > p2->exp)
{
push_back((0-(p2->coef)),p2->exp);
p2 = p2->next;
}
else if(p1->exp < p2->exp)
{
push_back(p1->coef,p1->exp);
p1 = p1->next;
}
else if(p1->exp == p2->exp)
{
temp = p1->coef - p2->coef;
push_back(temp,p2->exp);
p1 = p1->next;
p2 = p2->next;
}
}
if(p1 != y1->begin)
{
while(p1!=y1->begin)
{
push_back(p1->coef,p1->exp);
p1 = p1->next;
}
}
else if(p2 != y2->begin)
{
while(p2!=y2->begin)
{
push_back((0-p2->coef),p2->exp);
p2 = p2->next;
}
}
}
void DbList::sort()
{
if(IsEmpty())
{
cout<<"链表为空(sort)..."<<endl;
}
else
{
//p和m是断开后面的两个指针
DbListNode *p = begin->next;//p在后
DbListNode *m;              //m在前
p->pre->next = begin;
begin->pre = p->pre;
end = begin;
//h是新的链表这边的指针
DbListNode *h;
while(p!=begin)
{
m = p;
p = p->next;
h = begin->next;
while(h!=begin && m->exp<h->exp)
{
h = h->next;
}
if(h == begin)
{
end = m;
}
m->next = h;
m->pre = h->pre;
h->pre->next = m;
h->pre = m;
}
}
}

Status DbList::del_val(float y,int x)
{
DbListNode *p = begin->next;
while(p!=begin&&(p->exp!=x||p->coef!=y))
{
p = p->next;
}
if(p == begin)
{
cout<<"该值不存在..."<<endl;
return ERROR;
}
if(p == end)
{
end = p->pre;
}
p->pre->next = p->next;
p->next->pre = p->pre;
delete p;
--size;
return OK;
}
Status DbList::insert_val(float y,int x)
{
if(y == 0)
return ERROR;
DbListNode *s = new DbListNode;
s->coef = y;
s->exp = x;
s->next = NULL;
s->pre = NULL;
DbListNode *p = begin->next;
while(p!=begin && p->exp<x)
{
p = p->next;
}
if(p == begin)
{
end = s;
}
s->next = p;
s->pre = p->pre;
s->pre->next = s;
p->pre = s;
++size;
return OK;
}
Status DbList::pop_front()
{
if(IsEmpty())
{
cout<<"链表已空(pop_front)..."<<endl;
return ERROR;
}
DbListNode *p = begin->next;
begin->next = p->next;
p->next->pre = begin;
delete p;
--size;
if(size == 0)
{
end = begin;
}
return OK;
}
Status DbList::pop_back()
{
if(IsEmpty())
{
cout<<"链表已空(pop_back)..."<<endl;
return ERROR;
}
end->pre->next = begin;
begin->pre = end->pre;
delete end;
end = begin->pre;
--size;
return OK;
}
void DbList::show_dblist()
{
if(IsEmpty())
{
cout<<"空项式.....(show)";
}
else
{
sort();
listcom();
DbListNode *p = begin->next;
if(p->exp == 0)
{
cout<<p->coef;
}
else if(p->exp == 1&&p->coef!= 1)
{
cout<<p->coef<<"X";
}
else if(p->coef!=1&&p->exp!=1)
{
cout<<p->coef<<"X^"<<p->exp;
}
else if(p->coef == 1&&p->exp == 1)
{
cout<<"X";
}
else if(p->coef == 1&&p->exp !=1)
{
cout<<"X^"<<p->exp;
}
p = p->next;
if(p != begin)
{
if(p->coef>0)
cout<<" + ";
else if(p->coef<0)
cout<<" - "; 
}
while(p!=begin)
{
if(p->exp == 0)
{
cout<<fabs(p->coef);
}
else if(p->exp == 1&&p->coef!= 1)
{
cout<<fabs(p->coef)<<"X";
}
else if(p->coef!=1&&p->exp!=1)
{
cout<<fabs(p->coef)<<"X^"<<p->exp;
}
else if(p->coef == 1&&p->exp == 1)
{
cout<<"X";
}
else if(p->coef == 1&&p->exp !=1)
{
cout<<"X^"<<p->exp;
}
p = p->next;
if(p != begin)
{
if(p->coef>0)
cout<<" + ";
else if(p->coef<0)
cout<<" - "; 
}
}
cout<<endl;
}
}
Status DbList::push_back(float y,int x)
{
if(y != 0)
{
DbListNode *s = new DbListNode;
s->exp = x;
s->coef = y;
s->pre = end;
s->next = end->next;
end->next = s;
s->next->pre = s;
end = s;
++size;
return OK;
}
else
return ERROR;
}
void DbList::makeEmpty()
{
if(IsEmpty())
{
cout<<"链表已空(make empty)..."<<endl;
}
else
{
DbListNode *p = begin->next;
while(p!=begin)
{
p->pre->next = p->next;
p->next->pre = p->pre;
delete p;
p = begin->next;
}
end = begin;
size = 0;
}
}
void DbList::listadd(DbList *y1,DbList *y2)
{
float temp;
DbListNode *p1 = y1->begin->next;
DbListNode *p2 = y2->begin->next;
DbListNode *p;
while(p1!=y1->begin && p2!= y2->begin)
{
if(p1->exp > p2->exp)
{
push_back(p2->coef,p2->exp);
p2 = p2->next;
}
else if(p1->exp < p2->exp)
{
push_back(p1->coef,p1->exp);
p1 = p1->next;
}
else if(p1->exp == p2->exp)
{
temp = p1->coef + p2->coef;
push_back(temp,p2->exp);
p1 = p1->next;
p2 = p2->next;
}
}
if(p1 != y1->begin)
{
while(p1!=y1->begin)
   {
 push_back(p1->coef,p1->exp);
 p1 = p1->next;
   }
}
else if(p2 != y2->begin)
{
   while(p2!=y2->begin)
   {
 push_back(p2->coef,p2->exp);
 p2 = p2->next;
   }
}
}

下面试测试的主函数:

#include"mathical.h"
int main()
{
DbList y1;
DbList y2;
DbList y5;
DbList y6;
DbList y7;
DbList y8;
DbList save;
int select = 1;
int m;//多项式项数
while(select)
{
cout<<"---------------------------------"<<endl;
cout<<"[1]创建①多项式 [2]显示①多项式  "<<endl;
cout<<"[3]创建②多项式 [4]显示②多项式  "<<endl;
cout<<"[5]执行y1+y2    [6]执行y1-y2     "<<endl;
cout<<"[7]执行y1*y2    [8]执行y1/y2     "<<endl;
cout<<"[9]清空y1       [10]清空y2       "<<endl;
cout<<"---------------------------------"<<endl;
cout<<"请输入选择:>";
cin>>select;
switch(select)
{
case 1:
int eof;
float ceof;
int i;
cout<<"输入y1有多少项:>m";
cin>>m;
for(i=0;i<m;++i)
{
cout<<"请输入第"<<i+1<<"项的系数:>";
cin>>ceof;
cout<<"请输入第"<<i+1<<"项的指数:>";
cin>>eof;
y1.push_back(ceof,eof);
}
break;
case 2:
cout<<"y1 = ";
       y1.show_dblist();
break;
case 3:
cout<<"输入y2有多少项:>m";
cin>>m;
for(i=0;i<m;++i)
{
cout<<"请输入第"<<i+1<<"项的系数:>";
cin>>ceof;
cout<<"请输入第"<<i+1<<"项的指数:>";
cin>>eof;
y2.push_back(ceof,eof);
}
break;
case 4:
cout<<"y2 = ";
       y2.show_dblist();
break;
case 5:
y5.makeEmpty();
y5.listadd(&y1,&y2);
       cout<<"y5 = y1+y2 = ";
       y5.show_dblist();
break;
case 6:
y6.makeEmpty();
y6.listsub(&y1,&y2);
cout<<"y3 = y1-y2 = ";
y6.show_dblist();
break;
case 7:
y7.makeEmpty();
y7.listmul(&y1,&y2);
cout<<"y3 = y1*y2 = ";
y7.show_dblist();
break;
case 8:
y8.makeEmpty();
y8.listdiv(&y1,&y2,save);
cout<<"商为:"<<endl;
y8.show_dblist();
cout<<"余数为:"<<endl;
save.show_dblist();
break;
case 9:
y1.makeEmpty();
break;
case 10:
y2.makeEmpty();
break;

}

}

}

0 0
原创粉丝点击