#include <iostream>
using namespace std;
#include "LinkList.hpp" // 源文件包含节点和链表的定义声明
//单项式类
struct Monomial {
double coef; //系数
int exp; //指数
Monomial() { coef = 0; exp = 0; }//提供默认构造函数
Monomial(double c, int e) //调用系数和指数构造单项式的接口
{
coef = c;
exp = e;
}
void output() {//打印输出一个单项式
printf("%.f", coef);
if (exp) printf(" x^%d", exp); // 指数为0 不打印
}
};
//多项式类
struct Polynomial:public LinkList<Monomial>
{
void output()
{//输出多项式
Node* p = header.next;
while (p){//遍历输出每一项
p->data.output(); // 源文件里面
p = p->next;
if (p&&(p->data.coef >= 0))//进阶内容1,解决了多余打印"+"
printf("+");
}printf("\n");
}
Polynomial operator+(Polynomial&other)//删除引用类型符号&,思考为什么崩溃 ,因为无法取到链表的地址头指针
{ //实现多项式加法
Polynomial *result = new Polynomial(); //必须动态申请,思考为什么 ,因为节省空间,随用随时申请
Node *p = header.next; //A的当前结点
Node *q = other.header.next; //B的当前结点
Node *t = &result->header; //C的最后一个结点
Node* r;
while (p && q) {
//当A和B都有项未处理时
if (p->data.exp < q->data.exp)
{
t->next = new Node;
t->next->data = p->data;
p = p->next;
t = t->next;
}
else if (p->data.exp > q->data.exp)
{
t->next = new Node;
t->next->data = q->data;
q = q->next;
t = t->next;
}
else
{
t->next = new Node;
t->next->data.coef = p->data.coef + q->data.coef;
t->next->data.exp = p->data.exp;
p = p->next;
q = q->next;
t = t->next;
}
}
while (p)
{
t->next = new Node;
t->next->data = p->data;
p = p->next;
t = t->next;
}
while (q)
{
t->next = new Node;
t->next->data = q->data;
q = q->next;
t = t->next;
}
return *result;
}
};
int main()
{ //测试用例
Polynomial A;//测试创建一个多项式A
A.insert(Monomial(-6, 7)); // insert函数在LinkList结构体中
A.insert(Monomial(5, 3));
A.insert(Monomial(3, 0));
A.output(); Polynomial B;//测试创建一个多项式B
B.insert(Monomial(-7, 9));
B.insert(Monomial(6, 7));
B.insert(Monomial(3, 3));
B.output();
Polynomial C = A + B;//测试A+B
C.output();
return 0;
}
"LinkList.hpp"
#include "LinkList.hpp"
//单链表的封装
#include <iostream>
using namespace std;
//链表结点类
template<typename ElemType>
struct Node {
ElemType data;
Node* next = NULL; //结点指针
Node() { } // 默认构造函数
void release()
{//用递归的方法简单表达释放next所指的后继
if (next) {
next->release();//用递归调用
delete next;
}
}
};
//链表类
template<typename ElemType>
struct LinkList {
typedef Node<ElemType> Node;//重命名,通过此定义,以后视Node为Node<ElemType>
Node header;
int length = 0;//记录链表结点个数
~LinkList() {
//逐一销毁元素,提示:采用递归调用
header.release();
}
void insert(ElemType e) {
Node* p = new Node();
p->data = e;
p->next = header.next;
header.next = p;
length++;
}
void add(ElemType e) { //添加元素,尾插法
Node* p = new Node();
p->data = e;
Node* start = header.next;
Node* r; //尾指针
while (start->next != NULL) {
start = start->next; //指针移动到最后
}
r = start;
p->next = NULL;
r->next = p;// 结点加入到末尾
r = p;
length++;
}
};