数据结构--线性表的应用(一元多项式的加法)

用链表表示多项式时,每个链表结点存储多项式中的一一个非零项,包括系数coef指数expon两个数据域,以及一个指针域next。我们采用不带头结点的单链表结构存性一元多项式,并按照指数递减的顺序排列各项。仍以两个多项式P1(x)=9x^2+ 15x^8+3x^2和P2(x)=26x^9 -4x^8-13x^2 +82为例。

对链表存放的两个多项式进行加法运算,可以使用两个指针p1和p2。初始时,p1和p2分别指向这两个多项式的第一个结点(即指数最高的项)。通过循环,不断比较pl和p2所指的各结点,比较结果为以下三种情况之一, 并做不同处理:

①两数据项指数相等:将系数相加,若结果不为0,则作为结果多项式对应项的系数,连同指数一并存入结果多项式。接下来,沿两结点的指针域,使p1和p2都分别指向两个多项式的下一项,再进行新一轮的比较和处理。

②p1中的数据项指数较大: p2当前项不变,将p1的当前项存入结果多项式,并使p1指向下一项,再进行新一轮的比较和处理。

③p2中的数据项指数较大: p1当前项不变,将p2的当前项存入结果多项式,并使p2指向下一项,再进行新一轮的比较和处理 。

当某一多项式最后一个结点处理完时,停止上述求和过程,并将未处理完的另一个多项式的所有结点依次复制到结果多项式中。

//===File:application_PolyNode===//
#include 
using namespace std;
/*一元多项式的加法*/

//为了便于加法操作,链表应该按指数从高到低排序。这样可以逐项比较两个多项式的指数。
struct PolyNode {
	int coef;//系数
	int expon;//指数
	PolyNode *next;//指向下一个结点
};

//创建多项式
void insertPoly(PolyNode *&poly, int c, int e) {//需要传递 PolyNode*& poly 来确保修改的是原始链表。
	PolyNode *newNode = new PolyNode;
	newNode->coef = c;
	newNode->expon = e;
	newNode->next = nullptr;

	if (poly == nullptr || poly->expon < e) {
		//插入到头部
		newNode->next = poly;
		poly = newNode;
	} else {
		PolyNode *current = poly;
		while (current->next != nullptr && current->next->expon > e) {
			current = current->next;
		}
		if (current->next != nullptr && current->next->expon == e) {
			current->next->coef += c;
		} else {
			newNode->next = current->next;
			current->next = newNode;
		}
	}
}

//打印多项式
void printPoly(PolyNode *poly) {
	if (poly == nullptr) {
		cout << "0" << endl;
		return;
	}
	while (poly != nullptr) {
		if (poly->expon == 0) {
			cout << poly->coef;
		} else {
			cout << poly->coef << "x^" << poly->expon;
			if (poly->next != nullptr && poly->next->coef > 0) {
				cout << "+";
			}
		}
		poly = poly->next;
	}
	cout << endl;
}

//多项式加法
PolyNode *addPoly(PolyNode *p1, PolyNode *p2) {
	PolyNode *result = nullptr;

	while (p1 != nullptr && p2 != nullptr) {
		if (p1->expon > p2->expon) {
			insertPoly(result, p1->coef, p1->expon);
			p1 = p1->next;
		} else if (p1->expon < p2->expon) {
			insertPoly(result, p2->coef, p2->expon);
			p2 = p2->next;
		} else {
			int sum = p1->coef + p2->coef;
			if (sum != 0) {
				insertPoly(result, sum, p1->expon);
				p1 = p1->next;
				p2 = p2->next;
			}
		}
	}
	//将未处理完的另一个多项式的所有结点依次复制到结果多项式中
	while (p1 != nullptr) {
		insertPoly(result, p1->coef, p1->expon);
		p1 = p1->next;
	}
	while (p2 != nullptr) {
		insertPoly(result, p2->coef, p2->expon);
		p2 = p2->next;
	}
	return result;
}

int main() {
	PolyNode *poly1 = nullptr;
	PolyNode *poly2 = nullptr;

	// 创建第一个多项式 9x^12 + 15x^8 + 3x^2
	insertPoly(poly1, 9, 12);
	insertPoly(poly1, 15, 8);
	insertPoly(poly1, 3, 2);

	// 创建第二个多项式 26x^19 - 4x^8 - 13x^6 +82
	insertPoly(poly2, 26, 19);
	insertPoly(poly2, -4, 8);
	insertPoly(poly2, -13, 6);
	insertPoly(poly2, 82, 0);
	cout << "Poly 1: ";
	printPoly(poly1);
	cout << "Poly 2: ";
	printPoly(poly2);

	// 多项式加法
	PolyNode *result = addPoly(poly1, poly2);
	cout << "Sum: ";
	printPoly(result);

	return 0;
}

 

 

你可能感兴趣的:(数据结构,c++,算法)