之前自己看书学链表、栈、队列,觉得比较难懂,还是得自己动手实践下。这次就是实现一个多项式的加法和乘法运算,主要是要求熟练链表的各种操作。
看看程序的大体框架是:
设计数据结构:多项式的表示。可以用数组和链表。数组需事先确定数组大小,链表则对动态操作比较有利。
读多项式:这里需要设计一个attach函数,是用来将新的结点插入链尾的。
加法实现:多项式相加其实就是比较指数,相同则合并同类项,不同则直接插入到结果链表。
乘法实现:乘法实现比较复杂。大致的思路就是其中一个多项式的每一项与另一个多项式的每一项相乘。可以先将p1的第一项与p2的各项相乘得到一个初始的p,然后再双重循环
P1
p2
,系数相乘指数相加,再插入到初始链表的适当位置。由于原来的链表是按指数递减排列的,只要比较指数大小就可以找到适当的插入位置的。当然其中还有很多细节问题需注意。多项式输出:输出用循环,链表指针依次后移就行。
代码实现:
#include <cstdio>
#include <cstdlib>
#include <iostream>
typedef int Type;
typedef struct PolyNode *PolyNomial;
struct PolyNode {
Type coef;
Type expo;
PolyNomial link;
};
//多项式读入函数
void attach(Type e, Type c, PolyNomial *PtrRear) {
/*注意这里PtrRear实际上是指针的指针,为什么这么做呢?由于在本函数中要改变d当前结果表达式尾指针的值,
所以函数传递进来的是结点指针的地址,*PtrRear指向尾项*/
/*因为c语言中函数参数传递要改变参数值应采用传址方式*/
PolyNomial P;
P = (PolyNomial)malloc(sizeof(struct PolyNode));
P->coef = c;
P->expo = e;
P->link = NULL;
(*PtrRear)->link = P;
(*PtrRear) = P;
}
PolyNomial ReadPloy() {
int N, c, e;
PolyNomial P, Rear, t;
//生成一个头节点来使Rear指向它
P = (PolyNomial)malloc(sizeof(struct PolyNode));
P