一元多项式求和

实验内容:一元多项式求和

把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。

实验说明:

  1. 一元多项式可以用单链表表示,结点结构图示如下:
  2. coefexpnext

一元多项式算法伪代码如下:

1. 工作指针p、q初始化;

2. while(p存在且q存在)执行下列三种情形之一

   2.1 如果p->exp<q->exp,则指针p后移;

   2.2 如果p->exp>q->exp,则

      2.2.1 将结点q插入到结点p之前;

      2.2.2 指针q指向原指结点的下一个结点;

   2.3 如果p->exp=q->exp,则

          2.3.1 p->coef =p->coef+q->coef;

        2.3.2 如果p->coef ==0,则执行下列操作,否则,指针p后移;

          2.3.2.1 删除结点p;

          2.3.2.2 使指针p指向它原指结点的下一个结点;

      2.3.3 删除结点q;

      2.3.4 使指针q指向它原指结点的下一个结点;

     3. 如果q不为空,将结点q链接在第一个单链表的后面;

一、存放多项式的结构体

#include<iostream>

using namespace std;

#define MaxSize 100//节点最多100个

typedef struct {

double coef;//系数

int exp;//指数

}polyArray;

typedef struct node {

double coef;

int exp;

node* next;

}pnode;

二、输出

遍历每个数据结点,按coefXexp的形式输出。

void dispoly(pnode* L) {//输出单项式多链表

int  a = 1;

pnode* p = L->next;

while (p != NULL) {

if (a)

a = 0;

else if (p->coef > 0)

cout << "+";

if (p->exp == 0)

cout << p->coef;

else if (p->exp == 1)

if (p->coef == 1)//如果系数为1,且指数不为0时,不用输入1

cout << "x";

else

cout << p->coef << "x";

else

if (p->coef == 1)

cout << "x^" << p->exp;

else

cout << p->coef << "x^" << p->exp;

p = p->next;

}

cout << endl;

}

时间复杂度为O(n),n为单链表中的数据节点的个数。

三、建表

从一个空表中开始依次读取数组a中的元素,生成一个新节点是,将读取的的数组元素存放到该节点的数据域中,然后插入当前链表的表尾上,知道读完所有元素。

void createpoly(pnode*& L, polyArray a[], int n) {//用尾插法建表

pnode* s, * r;

int i;

L = new pnode;

L->next = NULL;

r = L;

for (i = 0; i < n; i++) {

s = new pnode;

s->coef = a[i].coef;

s->exp = a[i].exp;

r->next = s;

r = s;

}

r->next = NULL;

}

时间复杂度为O(n),n为单链表中的数据节点的个数。

四、排序

首先构造只有一个数据节点的有序表,将首节点复制入其中,然后扫描余下的节点,q保存p的后继节点,将pre保存p的前驱节点。用while循环找出指数最大的项,将节点p插入至pre的后面,随后继续扫描余下的节点,重复上述操作。

void sort(pnode*& L) {//将多项式里的项顺序排列

pnode* p = L->next, * pre, * q;

if (p != NULL) {//扫描节点

q = p->next;

p->next = NULL;

p = q;

while (p != NULL) {

q = p->next;

pre = L;

while (pre->next != NULL && pre->next->exp > p->exp)

pre = pre->next;

p->next = pre->next;

pre->next = p;

p = q;

}

}

}

时间复杂度为O(n2),n为单链表中的数据节点的个数。

五、相加

创建pnode r,始终指向c的尾节点;然后扫描a与b,将na->exp与nb->exp相比较,不一样时,较大的一项复制到c中;一样时两数相加,结果不为0时复制到c中。继续扫描,重复一样的操作,直至一方全部扫描完毕。如果余下的是nb,将其复制na中,再将其复制到c中,最后将b的尾节点置空。

void add(pnode* a, pnode* b, pnode*& c) {//两个多项式相加

pnode* na = a->next, * nb = b->next, * s, * r;

double number;

c = new pnode;

r = c;

while (na != NULL && nb != NULL) {

if (na->exp > nb->exp) {//将指数较大的复制到c中

s = new pnode;

s->exp = na->exp;

s->coef = na->coef;

r->next = s;

r = s;

na = na->next;

}

else if (na->exp < nb->exp) {

s = new pnode;

s->exp = nb->exp;

s->coef = nb->coef;

r->next = s;

r = s;

nb = nb->next;

}

else {

number = na->coef + nb->coef;

if (number != 0) {

s = new pnode;

s->exp = na->exp;

s->coef = number;

r->next = s;

r = s;

}

na = na->next;

nb = nb->next;

}

}

if (nb != NULL)na = nb;//扫描余下的项

if (na != NULL) {

s = new pnode;

s->exp = na->exp;

s->coef = nb->coef;

r->next = s;

r = s;

na = na->next;

}

r->next = NULL;

}

时间复杂度为O(n+m),n为单链表a中的数据节点的个数,m为单链表b中的数据节点的个数。

六、主函数

int main() {

cout << "输入两个多项式的项数;" << endl;

pnode* a, * b, * c;

int m, n, i;

polyArray a1[MaxSize], b1[MaxSize];

cin >> m >> n;

cout << "输入指数与系数:" << endl;

for (i = 0; i < m; i++) {

cout << "输入第一个多项式第" << i + 1 << "项:";

cin >> a1[i].coef >> a1[i].exp;

cout << endl;

}

for (i = 0; i < n; i++) {

cout << "输入第二个多项式第" << i + 1 << "项:";

cin >> b1[i].coef >> b1[i].exp;

cout << endl;

}

createpoly(a, a1, m);

createpoly(b, b1, n);

cout << "输入的多项式:" << endl;

dispoly(a);

dispoly(b);

cout << "排列后:" << endl;

sort(a);

sort(b);

dispoly(a);

dispoly(b);

add(a, b, c);

cout << "最终结果:" << endl;

dispoly(c);

return 0;

}

七、执行结果


总结

通过本次实验,我们进一步掌握了数据结构中多项式相加的实现方法。 在实验过程中,我们通过定义多项式的结构体,实现了多项式的相加运算,并通过实际的计算验证了算法的正确性。 在实验结果分析中,我们通过对多项式相加操作的实验结果进行了分析,并得出了正确的结论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值