刷题日记 - 一元多项式的乘法与加法运算(链表实现)

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

 

#include<iostream>
#include<vector>
using namespace std;

typedef struct Node* List;
struct Node {
	int coef;
	int exp;
	List Next;
};
struct Node L;
List Pointer;
//calculate length of list
int lengthRe(List Pt) {
	List p = Pt;
	int i = 0;
	while (p) {
		p = p->Next;
		i++;
	}
	return i;
}
//link node
void linkNode(int coef, int exp, List *lrear) {
	List ptr;
	ptr = (List)malloc(sizeof(struct Node));
	ptr->coef = coef;
	ptr->exp = exp;
	ptr->Next = NULL;
	(*lrear)->Next = ptr;	//point new node
	*lrear = ptr;	//move *lrear to point ptr. so, we can add new node by *lrear.
}
//read list
List readList() {
	List null_point;
	List rear, temp;
	//List node;
	int coef0, exp0;
	int n;
	//creat a null node
	null_point = (List)malloc(sizeof(struct Node));
	null_point->Next = NULL;
	rear = null_point;
	cin >> n;
	while (n--) {
		cin >> coef0 >> exp0;
		linkNode(coef0, exp0, &rear);
	}
	//delete first null node
	temp = null_point;
	null_point = null_point->Next;
	free(temp);
	return null_point;
}

List addPolynomial(List pa, List pb) {
	List p_add, rear;
	List temp;
	p_add = (List)malloc(sizeof(struct Node));
	p_add->Next = NULL;
	rear = p_add;
	while (pa && pb) {
		if (pa->exp == pb->exp) {
			if ((pa->coef + pb->coef) == 0) {
				//linkNode(0, 0, &rear);
				pa = pa->Next;
				pb = pb->Next;
			}
			else {
				linkNode(pa->coef + pb->coef, pa->exp, &rear);
				pa = pa->Next;
				pb = pb->Next;
			}
		}
		else if (pa->exp > pb->exp) {
			linkNode(pa->coef, pa->exp, &rear);
			pa = pa->Next;
		}
		else {
			linkNode(pb->coef, pb->exp, &rear);
			pb = pb->Next;
		}
	}
	while (pa) {
		linkNode(pa->coef, pa->exp, &rear);
		pa = pa->Next;
	}
	while (pb) {
		linkNode(pb->coef, pb->exp, &rear);
		pb = pb->Next;
	}
	temp = p_add;  
	p_add = p_add->Next;
	free(temp);
	return p_add;
}
//calculate two polynomials mult
List multPolynomial(List pa, List pb) {
	List pb0, pb1;
	List p_mult0, p_mult1, rear0, rear1, temp0, temp1;
	if (!pa || !pb) return NULL;
	pb0 = pb;
	p_mult0 = (List)malloc(sizeof(struct Node));
	p_mult0->Next = NULL;
	rear0 = p_mult0;
	while (pb0) {
		linkNode(pa->coef * pb0->coef, pa->exp + pb0->exp, &rear0);
		pb0 = pb0->Next;
	}
	//free first null node
	temp0 = p_mult0;
	p_mult0 = p_mult0->Next;
	free(temp0);
	pa = pa->Next;
	while (pa) {
		pb1 = pb;
		p_mult1 = (List)malloc(sizeof(struct Node));
		p_mult1->Next = NULL;
		rear1 = p_mult1;
		while (pb1) {
			linkNode(pa->coef * pb1->coef, pa->exp + pb1->exp, &rear1);
			pb1 = pb1->Next;
		}
		temp1 = p_mult1;
		p_mult1 = p_mult1->Next;
		free(temp1);
		p_mult0 = addPolynomial(p_mult0, p_mult1);
		pa = pa->Next;
	}
	return p_mult0;
}
//print polynomial value.
//if has 0 in list, we should do specially. 
void printList(List node) {
	int length = lengthRe(node);
	if (!node) {
		cout << 0 << " " << 0;
	}
	else {
		for (int i = 1; i <= length; i++) {
			cout << node->coef << " " << node->exp;
			node = node->Next;
			if (i != length) { cout << " "; }
		}
	}
}

int main() {
	List polynomial_A, polynomial_B;
	List poly_add, poly_mult;
	int length1;
	polynomial_A = readList();
	polynomial_B = readList();
	poly_mult = multPolynomial(polynomial_A, polynomial_B);
	printList(poly_mult);
	cout << endl;
	poly_add = addPolynomial(polynomial_A, polynomial_B);
	printList(poly_add);
	return 0;
}

 

Guess you like

Origin blog.csdn.net/qq_38844835/article/details/119155072