实验内容:一元多项式求和
把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。
实验说明:
- 一元多项式可以用单链表表示,结点结构图示如下:
-
coef exp next
一元多项式算法伪代码如下:
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; } 七、执行结果 |
总结
通过本次实验,我们进一步掌握了数据结构中多项式相加的实现方法。 在实验过程中,我们通过定义多项式的结构体,实现了多项式的相加运算,并通过实际的计算验证了算法的正确性。 在实验结果分析中,我们通过对多项式相加操作的实验结果进行了分析,并得出了正确的结论。