#include<iostream.h>
#include<malloc.h>
typedef struct node{
float coef; //系数
int expn; //指数
struct node *next;
} polynomial;
//.....基本操作的函数原型说明......
void Initlist(polynomial * &sq) //初始化函数
{
sq=(polynomial *)malloc(sizeof(polynomial));
sq->next=NULL;
}
int GetLen(polynomial *sq) //求表长函数
{
int i=0;
polynomial *p=sq->next;
while(p!=NULL){
i++;p=p->next;
}return i;
}
polynomial *GetElem(polynomial *sq,int i) //按序号查找函数
{
int j=1;
polynomial *p=sq->next;
if(i<1 || i>GetLen(sq))
return NULL;
while(j<i){
p=p->next; j++;
}
return p;
}
polynomial *Locate(polynomial *sq,float c,int e) //定位函数
{
polynomial *p=sq->next;
while(p!=NULL && (p->coef!=c || p->expn!=e))
p=p->next;
return p;
}
int InsElem(polynomial *sq,float c,int e,int i) //插入函数
{
int j=1;
polynomial *p=sq,*s;
s=(polynomial *)malloc(sizeof(polynomial));
s->coef=c; s->expn=e; s->next=NULL;
if(i<1 || i>GetLen(sq)+1)
return 0;
while(j<1){
p=p->next; j++;
}
s->next=p->next;
p->next=s;
return 1;
}
int DestroyPolyn(polynomial *sq,int i) //删除函数
{
int j=1;
polynomial *p=sq,*q;
if(i<1 || i>GetLen(sq))
return 0;
while (j<1) {
p=p->next;j++;
}
q=p->next;
p->next=q->next;
free(q);
return 1;
}
void PrintPolyn(polynomial *sq) //输出链表函数
{
polynomial *p=sq->next;
while (p!=NULL){
cout<<"("<<p->coef<<","<<p->expn<<")";
p=p->next;
}
cout<<endl;
}
void CreatPolyn(polynomial *&sq,float C[],int E[],int n) //创建一个多项式单链表
{
int i;
Initlist(sq);
for(i=0;i<n;i++)
InsElem(sq,C[i],E[i],i+1);
}
void order(polynomial *sq) //将一个任意次序的多项式单链表,按expn数据域值从小到大顺序排列
{
polynomial *p=sq->next,*q,*pre;
sq->next=NULL;
while(p!=NULL){
if (sq->next==NULL){ //处理第一个结点
sq->next=p; p=p->next; sq->next->next=NULL;
}
else { //处理其余结点
pre=sq; q=pre->next;
while (q!=NULL && p->expn>q->expn){ //找到*pre结点
pre=q; q=q->next;
}
q=p->next; //在*pre结点之后插入*p
p->next=pre->next;
pre->next=p;
p=q;
}
}
}
polynomial *AddPolyn(polynomial *pa,polynomial *pb) //多项式加法
{
polynomial *pc,*p1=pa->next,*p2=pb->next,*p,*rear,*s;
pc=(polynomial *)malloc(sizeof(polynomial));
pc->next=NULL; rear=pc;
while(p1!=NULL && p2!=NULL){
if (p1->expn<p2->expn){
s=(polynomial *)malloc(sizeof(polynomial));
s->coef=p1->coef;s->expn=p1->expn;s->next=NULL;
rear->next=s; rear=s;
p1=p1->next;
}
else if (p1->expn>p2->expn){
s=(polynomial *)malloc(sizeof(polynomial));
s->coef=p2->coef;s->expn=p2->expn;s->next=NULL;
rear->next=s;rear=s;
p2=p2->next;
}
else{
if (p1->coef + p2->coef!=0){
s=(polynomial *)malloc(sizeof(polynomial));
s->coef=p1->coef+p2->coef;s->expn=p1->expn;
s->next=NULL;
rear->next=s; rear=s;rear->next=NULL;
}
p1=p1->next;p2=p2->next;
}
}
if(p1!=NULL)p=p1;
else p=p2;
while (p!=NULL) {
s=(polynomial *)malloc(sizeof(polynomial));
s->coef=p->coef;s->expn=p->expn;s->next=NULL;
rear->next=s;rear=s;rear->next=NULL;
p=p->next;
}
return pc;
}
polynomial *SubtractPolyn(polynomial *pa,polynomial *pb) //多项式减法
{
polynomial *pc,*p1=pa->next,*p2=pb->next,*p,*rear,*s;
pc=(polynomial *)malloc(sizeof(polynomial));
pc->next=NULL; rear=pc;
while(p1!=NULL && p2!=NULL){
if (p1->expn<p2->expn){
s=(polynomial *)malloc(sizeof(polynomial));
s->coef=p1->coef;s->expn=p1->expn;s->next=NULL;
rear->next=s; rear=s;
p1=p1->next;
}
else if (p1->expn>p2->expn){
s=(polynomial *)malloc(sizeof(polynomial));
s->coef=(-1) * p2->coef;s->expn=p2->expn;s->next=NULL;
rear->next=s;rear=s;
p2=p2->next;
}
else{
if (p1->coef + p2->coef!=0){
s=(polynomial *)malloc(sizeof(polynomial));
s->coef=p1->coef-p2->coef;s->expn=p1->expn;
s->next=NULL;
rear->next=s; rear=s;rear->next=NULL;
}
p1=p1->next;p2=p2->next;
}
}
if(p1!=NULL)
{
p=p1;
while (p!=NULL) {
s=(polynomial *)malloc(sizeof(polynomial));
s->coef=p->coef;s->expn=p->expn;s->next=NULL;
rear->next=s;rear=s;rear->next=NULL;
p=p->next;
}
}
else
{
p=p2;
while (p!=NULL) {
s=(polynomial *)malloc(sizeof(polynomial));
s->coef=(-1) * p->coef;s->expn=p->expn;s->next=NULL;
rear->next=s;rear=s;rear->next=NULL;
p=p->next;
}
}
return pc;
}
polynomial *MultiplyPolyn(polynomial *pa,polynomial *pb) //多项式乘法
{
polynomial *pc,*p1=pa->next,*p2,*s,*rear,*pd;
pc=(polynomial *)malloc(sizeof(polynomial));
pc->next=NULL;
for(int i=1;i<=GetLen(pa);i++)
{
rear=(polynomial *)malloc(sizeof(polynomial));
pd=(polynomial *)malloc(sizeof(polynomial));
pd->next=NULL;rear=pd;
p2=pb->next;
for(int j=1;j<=GetLen(pb);j++)
{
s=(polynomial *)malloc(sizeof(polynomial));
s->coef=p1->coef * p2->coef;
s->expn=p1->expn + p2->expn;
s->next=NULL;
rear->next=s;rear=s;
p2=p2->next;
}
p1=p1->next;
pc=AddPolyn(pc,pd);
}
return pc;
}
void main()
{
polynomial *ha,*hb,*hc;
float Ca[]={2,-4,6,-8}, Cb[]={1,3,5,-7,8};
int Ea[]={0,1,2,3},Eb[]={1,2,4,5,6};
CreatPolyn(ha,Ca,Ea,4);
CreatPolyn(hb,Cb,Eb,5);
order(ha);
order(hb);
cout<<"原多项式A:";PrintPolyn(ha);
cout<<"原多项式B:";PrintPolyn(hb);
cout<<"两个多项式相加:"<<endl;
hc=AddPolyn(ha,hb);
cout<<"hc=";PrintPolyn(hc);
cout<<"两个多项式相减:"<<endl;
hc=SubtractPolyn(ha,hb);
cout<<"hc=";PrintPolyn(hc);
cout<<"两个多项式相乘:"<<endl;
hc=MultiplyPolyn(ha,hb);
cout<<"hc=";PrintPolyn(hc);
}
ADT多项式
最新推荐文章于 2022-05-28 01:59:36 发布