多项式的加法

1.多项式的形式

用链表的原因
多项式需要有序性,在插入时满足
有序性

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef struct{
	float coef;//系数
	int expn;//指数
}Polynomial;
typedef Polynomial *ElemType;
typedef struct PNode *LinkList;
typedef struct PNode{
	ElemType data;//数据域
	LinkList next;//指针域
}PNode;
//初始化
void InitList(LinkList &L){
	L = new PNode;
	L->data = new Polynomial;
	L->next = NULL;
	return;
}
//查找指数重复
LinkList LocateExpn(LinkList L, int e){
	//while (L->data->expn<=e){
	while (L){
		if (L->data->expn == e)return L;
		L = L->next;
	}
	return NULL;
}
//删除(根据指数查找,来删除加过后系数为0的无用项)
void DeleteList(LinkList &L, Polynomial e){
	if (L->data->expn == e.expn&&L->next == NULL){
		delete L; L = NULL; return;
	}
	while (L->next){
		if (L->next->data->expn == e.expn){
			LinkList q = L->next;
			L->next = L->next->next;
			delete q;
			return;
		}
	}
	return;
}
//插入
void InsertList(LinkList &L, Polynomial e){
	if (!L){
		InitList(L);
		*L->data = e;
	}
	else if (fabs(e.coef) <0.000005)//系数是float型,如果是为零就是绝对值<0.00000005,就不插入
		return;
	else if (!LocateExpn(L, e.expn)){
		if (L->data->expn > e.expn){//使得插入有序,若e的系数较小就互换值再进行递归
			Polynomial t = e;
			e = *L->data;
			*L->data = t;
		}
		InsertList(L->next, e);
	}
		
	else//若出现过直接系数相加
	{
		L->data->coef += e.coef;
		if (fabs(L->data->coef) < 0.0000005)
			DeleteList(L, *L->data);
	}
		
	return;
}
//查表长
int LengthList(LinkList L){
	int n = 0;
	while (L){
		L = L->next;
		n++;
	}
	return n;
}
//加法
void AddList(LinkList &A, LinkList B){
	LinkList root=A;//root是A的根,否则当A=NULL再往A中插元素无法和之前的挂接上
	while (A&&B){
		if (A->data->expn > B->data->expn)//目标多项式指数较大,直接插入
			InsertList(root, *B->data);//从A的根开始插入,以便有序
		else if (A->data->expn == B->data->expn)//指数相等,系数相加
			A->data->coef += B->data->coef;
			if (A->data->expn >= B->data->expn)//若符合可操作的数,那么操作完B遍历下一个
				B = B->next;
		A = A->next;//目标多项式指数较小或者已经操作过,遍历下一个	
	}
	A = root;
	while (B){//B最大的指数比A最大的指数要大,全插入
		InsertList(A, *B->data);
		B = B->next;
	}
	return;
}
//输出
void ShowList(LinkList L){
	cout << "多项式:";
	int n = LengthList(L);
	while (n--){
		if (L->data->coef != 1 || L->data->expn == 0)//系数为1且指数不为0不用写
		cout << L->data->coef;
		if (L->data->expn != 0 ){//指数为0不用写x
			cout << "x";
			if (L->data->expn != 1)//指数为1不用写x^1
				cout << "^" << L->data->expn;
		}
		
		L = L->next;
		if (n)
			printf("+");
	}
	return;
}

int main(){
	LinkList A=NULL, B=NULL;
	int a;
	ElemType t=new Polynomial;
	cout << "A的项数:";
	cin >> a;
	cout << "系数/指数:";
	for (int i = 0; i < a; i++){
		cin >> t->coef >> t->expn;
		InsertList(A, *t);
	}
	cout << "B的项数:";
	cin >> a;
	cout << "系数/指数:";
	for (int i = 0; i < a; i++){
		cin >> t->coef >> t->expn;
		InsertList(B, *t);
	}
	AddList(A, B);
	ShowList(A);

	system("PAUSE");
	return 0;
}

0.结构体

typedef struct{
	float coef;//系数
	int expn;//指数
}Polynomial;
typedef Polynomial *ElemType;
typedef struct PNode *LinkList;
typedef struct PNode{
	ElemType data;//数据域
	LinkList next;//指针域
}PNode;

1.初始化

void InitList(LinkList &L){
	L = new PNode;
	L->data = new Polynomial;
	L->next = NULL;
	return;
}

2.查找指数重复

LinkList LocateExpn(LinkList L, int e){
	//while (L->data->expn<=e){
	while (L){
		if (L->data->expn == e)return L;
		L = L->next;
	}
	return NULL;
}

3.删除

//删除(根据指数查找,来删除加过后系数为0的无用项)
void DeleteList(LinkList &L, Polynomial e){
	if (L->data->expn == e.expn&&L->next == NULL){
		delete L; L = NULL; return;
	}
	while (L->next){
		if (L->next->data->expn == e.expn){
			LinkList q = L->next;
			L->next = L->next->next;
			delete q;
			return;
		}
	}
	return;
}

4.插入

void InsertList(LinkList &L, Polynomial e){
	if (!L){
		InitList(L);
		*L->data = e;
	}
	else if (fabs(e.coef) <0.000005)//系数是float型,如果是为零就是绝对值<0.00000005,就不插入
		return;
	else if (!LocateExpn(L, e.expn)){
		if (L->data->expn > e.expn){//使得插入有序,若e的系数较小就互换值再进行递归
			Polynomial t = e;
			e = *L->data;
			*L->data = t;
		}
		InsertList(L->next, e);
	}
		
	else//若出现过直接系数相加
	{
		L->data->coef += e.coef;
		if (fabs(L->data->coef) < 0.0000005)
			DeleteList(L, *L->data);
	}
		
	return;
}

5.查表长

int LengthList(LinkList L){
	int n = 0;
	while (L){
		L = L->next;
		n++;
	}
	return n;
}

6.加法

void AddList(LinkList &A, LinkList B){
	LinkList root=A;//root是A的根,否则当A=NULL再往A中插元素无法和之前的挂接上
	while (A&&B){
		if (A->data->expn > B->data->expn)//目标多项式指数较大,直接插入
			InsertList(root, *B->data);//从A的根开始插入,以便有序
		else if (A->data->expn == B->data->expn)//指数相等,系数相加
			A->data->coef += B->data->coef;
			if (A->data->expn >= B->data->expn)//若符合可操作的数,那么操作完B遍历下一个
				B = B->next;
		A = A->next;//目标多项式指数较小或者已经操作过,遍历下一个	
	}
	A = root;
	while (B){//B最大的指数比A最大的指数要大,全插入
		InsertList(A, *B->data);
		B = B->next;
	}
	return;
}

7.输出

//输出
void ShowList(LinkList L){
	cout << "多项式:";
	int n = LengthList(L);
	while (n--){
		if (L->data->coef != 1 || L->data->expn == 0)//系数为1且指数不为0不用写
		cout << L->data->coef;
		if (L->data->expn != 0 ){//指数为0不用写x
			cout << "x";
			if (L->data->expn != 1)//指数为1不用写x^1
				cout << "^" << L->data->expn;
		}
		
		L = L->next;
		if (n)
			printf("+");
	}
	return;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Deosiree

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值