#include<iostream>
using namespace std;
#include<stdlib.h>
typedef struct LNode
{//构造结构体变量
int coefficient;//定义一个结构体变量“系数”
int exponent;//定义一个结构体变量“指数”
struct LNode* next;
}LNode,*LinkList;
void InitList(LinkList &L)
{
L=new LNode;//或L=(LinkList)malloc(sizeod(LNode));
L->next=NULL;
}
void CreateList(LinkList &L,int n)//尾插法
{
int i;
LinkList p,r;
r=L;
for(i=1;i<=n;i++)
{
p=new LNode;
cout<<"第"<<i<<"项系数:";
cin>>p->coefficient;
cout<<"第"<<i<<"项指数:";
cin>>p->exponent;
p->next=NULL;
r->next=p;
r=p;
}
}
void paixu(LinkList &L)//将多项式按升幂冒泡排序
{
LinkList p,q;
int temp, temp1;
for (p = L->next; p != NULL; p = p->next) //最开始p指向首元结点,每循环一次,p指向下一个结点
{
for (q = p->next; q != NULL; q = q->next) //最开始q为p的后继结点,每循环一次,p指向下一个结点
{
if (p->exponent > q->exponent) //如果p的指数比q的指数大,也就是前一项的指数比后一个指数大,那么交换它们的指数和系数
{
temp = p->exponent;
p->exponent = q->exponent;
q->exponent = temp;
temp1 = p->coefficient;
p->coefficient = q->coefficient;
q->coefficient = temp1;
}
}
}
}
void Merge(LinkList &L)//排序后的合并同类项
{
LinkList p=L,t,r=L,s;
while(p->next)//排序后指数相同的前后两项合并
{
if(p->exponent==p->next->exponent){
t=p->next;
p->coefficient+=p->next->coefficient;
p->next=p->next->next;
free(t);
}
else{
p=p->next;
}
}
while(r->next)//合并同类项后删掉系数为0的项
{
if(r->next->coefficient==0)
{
s=r->next;
r->next=s->next;
delete s;
r=r->next;
}
else r=r->next;
}
}
void PrintList(LinkList L)
{
paixu(L);
Merge(L);
LinkList p;
p=L->next;
if(p->exponent==0)//如果第一项指数为0 ,只输出系数
cout<<p->coefficient;
else//第一项指数不为0
cout<<p->coefficient<<"x^("<<p->exponent<<")";
p=p->next;
while(p)
{
if(p->exponent==0)
cout<<p->coefficient;
else
{
if(p->coefficient>0)
{
cout<<"+"<<p->coefficient<<"x^("<<p->exponent<<")";
}
if(p->coefficient<0)
{
cout<<p->coefficient<<"x^("<<p->exponent<<")";
}
}
p=p->next;
}
}
void Add(LinkList La,LinkList Lb,LinkList &L1)
{
LinkList a,b,r,p;
a=La->next;b=Lb->next;r=L1;
while(b!=NULL)//把Lb接在L2上
{
p=new LNode;
p->coefficient=b->coefficient;
p->exponent=b->exponent;
p->next=r->next;
r->next=p;
r=r->next;
b=b->next;
}
while(a!=NULL)//再接上La
{
p=new LNode;
p->coefficient=a->coefficient;
p->exponent=a->exponent;
p->next=r->next;
r->next=p;
r=r->next;
a=a->next;
}
paixu(L1);
Merge(L1);//排序后的合并同类项
PrintList(L1);
}
void Sub(LinkList La,LinkList Lb,LinkList &L2)
{
LinkList a,b,p,r;
a=La->next;b=Lb->next;r=L2;
while(b!=NULL)//把Lb的系数全变为相反数接在L2上
{
p=new LNode;
p->coefficient=0-(b->coefficient);
p->exponent=b->exponent;
p->next=r->next;
r->next=p;
r=r->next;
b=b->next;
}
while(a!=NULL)//再接上La
{
p=new LNode;
p->coefficient=a->coefficient;
p->exponent=a->exponent;
p->next=r->next;
r->next=p;
r=r->next;
a=a->next;
}
paixu(L2);
Merge(L2);//排序后的合并同类项
PrintList(L2);
}
void Mult(LinkList La,LinkList Lb,LinkList &L3)
{
LinkList a,b,p,r;
a=La->next;b=Lb->next;r=L3;
while(a!=NULL)//遍历F1的每一项
{
while(b!=NULL)//遍历F2的每一项
{
p=new LNode;
p->coefficient=a->coefficient*b->coefficient;
p->exponent=a->exponent+b->exponent;
p->next=r->next;
r->next=p;
r=r->next;
b=b->next;
}
a=a->next;b=Lb->next;
}
paixu(L3);
Merge(L3);//排序后的合并同类项
PrintList(L3);
}
int main()
{
int m,n;
LinkList La,Lb,L1,L2,L3,L4;
InitList(La);
InitList(Lb);
InitList(L1);
InitList(L2);
InitList(L3);
InitList(L4);
cout<<"F1有几项:";
cin>>m;
CreateList(La,m);
cout<<"F1:";
PrintList(La);
cout<<endl<<"F2有几项:";
cin>>n;
CreateList(Lb,n);
cout<<"F2:";
PrintList(Lb);
cout<<endl<<"F1+F2=";
Add(La,Lb,L1);
cout<<endl<<"F1-F2=";
Sub(La,Lb,L2);
cout<<endl<<"F1*F2=";
Mult(La,Lb,L3);
}
一元多项式的加减乘(C++单链表)
于 2022-07-15 22:17:15 首次发布