单链表的运用 -- 多项式的加法

#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++;
	}
	
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值