您的位置:首页 > 理论基础 > 数据结构算法

3.数据结构--线性表之一元多项式的加法与乘法运算

2016-06-05 22:45 375 查看
设计一个函数,分别求出两个一元多项式的和与乘积

##输入样例

4 3 4 -5 2 6 1 -2 0

3 5 20 -7 4 3 1

#输出结果

5 20 -4 4 -5 2 9 1 -2 0
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1

#include <iostream>
using namespace std;

typedef struct PolyNode *Polynomial;
struct PolyNode
{
int coef;    //系数
int expon;   //指数
Polynomial next;
};

int compare(int c1, int c2)
{
if (c1 > c2) return 1;
else if (c1 < c2) return -1;
else return 0;
}

void Attach(int c, int e, Polynomial &pRear)
{
Polynomial Tmp = new struct PolyNode;

Tmp->coef = c;
Tmp->expon = e;
Tmp->next = NULL;

pRear->next = Tmp;
pRear = Tmp;
}

Polynomial ReadPoly()
{
int N;  //读入项数
cin >> N;

Polynomial L = new struct PolyNode; //生成头结点
L->next = NULL;
Polynomial rear = L;

while (N--)
{
int c, e;
cin >> c >> e;
Attach(c, e, rear);
}

Polynomial head = L->next;
delete L;
return head;
}

Polynomial ReadPoly_Decrease()         //如果输入的不是按照递减的顺序,通过这个函数可以实现构造多项式是按照系数递减的顺序构造的
{
int N;  //读入项数
cin >> N;

Polynomial L = new struct PolyNode; //生成头结点
L->next = NULL;

while (N--)
{
int c, e;
cin >> c >> e;

Polynomial p = L;
Polynomial Tmp = new struct PolyNode;

Tmp->coef = c;
Tmp->expon = e;
Tmp->next = NULL;

while (p->next && p->next->expon > e) //按照指数递减的顺序寻找读入的元素应该插入的位置
p = p->next;

Tmp->next = p->next;
p->next = Tmp;
}

Polynomial head = L->next;
delete L;
return head;
}

Polynomial Add(Polynomial P1, Polynomial P2)
{
Polynomial P3 = new struct PolyNode;
P3->next = NULL;
Polynomial rear = P3;

while (P1 && P2)
{
switch (compare(P1->expon,P2->expon))
{
case -1:                                 //P2的指数较大
Attach(P2->coef, P2->expon, rear);
P2 = P2->next;
break;
case 1:                                 //P1的指数较大
Attach(P1->coef, P1->expon, rear);
P1 = P1->next;
break;
case 0:
if (P1->coef + P2->coef != 0)
Attach(P1->coef + P2->coef, P1->expon, rear);

P1 = P1->next;
P2 = P2->next;
break;
default:
break;
}
}
rear->next = P1 ? P1 : P2;

Polynomial head = P3->next;
delete P3;
return head;
}

Polynomial Mult(Polynomial P1, Polynomial P2)
{
Polynomial P3 = new struct PolyNode;
P3->next = NULL;
Polynomial rear = P3;

Polynomial t1 = P1;
Polynomial t2 = P2;

while (t2)
{
Attach(t1->coef*t2->coef, t1->expon + t2->expon, rear);
t2 = t2->next;
}
t1 = t1->next;

while (t1)
{
t2 = P2;
while (t2)
{
int c = t1->coef * t2->coef;
int e = t1->expon + t2->expon;

//找到正确的插入位置
Polynomial p = P3;
while (p->next && p->next->expon > e) //按照指数递减的顺序寻找读入的元素应该插入的位置
p = p->next;

Polynomial q = p->next;
if(q && q->expon == e)       //指数相等的情况
{
if (q->coef + e != 0)  //系数相加不为0
{
q->coef += c;
}
else               //系数的结果相加为0
{
p->next = q->next;
delete q;
}
}
else
{
Polynomial Tmp = new struct PolyNode;     //构造新的结点
Tmp->coef = c;
Tmp->expon = e;

Tmp->next = q;
p->next = Tmp;
}
t2 = t2->next;
}
t1 = t1->next;
}

Polynomial head = P3->next;
delete P3;
return head;
}

void PrintPoly(Polynomial P)
{
int flag = 0; //标记是否为第一项
while (P)
{
if (!P) cout << "0 0" << endl;

if (flag == 0) flag = 1;
else cout << " ";

cout << P->coef << " " << P->expon;
P = P->next;
}
cout << endl;
}

int main()
{
Polynomial P1 = ReadPoly();
Polynomial P2 = ReadPoly();
PrintPoly(P1);
PrintPoly(P2);
Polynomial add_p1_p2 = Add(P1, P2);
PrintPoly(add_p1_p2);

Polynomial mult_p1_p2 = Mult(P1, P2);
PrintPoly(mult_p1_p2);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: