多项式相加·数据结构

255 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

数据结构是一门快乐的学科,你需要沉浸在代码的快乐里

数据结构有一道很经典的题目——多项式相加

这里的要求是用链表的形式完成这串代码

我们需要先设置一个结点,这个结点包括了指针域,系数,以及指数

struct Node {
    int coef;//系数
    int exp;//指数
    Node* next;//指针
};

接着,我定义了一个叫Polynomial的类(多项式) ​

class Polynomial {
public:
	Node* head;
	int len;
    //函数部分省略,在下面的地方会详细的说
}

​ 它包含了一个Node的头结点

多项式的长度

以及最关键的函数

我来介绍一下函数吧

初始化函数

void Init() {
    head = new Node;
    head->next = NULL;
    len = 0;
}

给头结点赋空间,并指向NULL,len=0;

输出函数

void Output()
	{
		Node* p;
		if (len == 0) {
			cout << "该多项式为空" << endl;
		}
		else {
			cout << "该多项式为:" << endl;
			p = head->next;
			for (int i = 0; i < len; i++) {
				cout << "<" << p->coef << "," << p->exp << ">||";
				p = p->next;
			}
			cout << endl;
		}
	}

​ 输出函数需要一个新的结点p,len不等于0的话,p=p->next,持续输出

插入函数

void Insert(int pos, int coef, int exp) {
		Node* p = head;
		for (int i = 1; i < pos; i++) {
			p = p->next;
		Node* s = new Node;
		s->coef = coef;
		s->exp = exp;
		s->next = p->next;
		p->next = s;
		len++;
	}

​ 插入函数有三个形参,分别是位置pos,系数coef,指数exp三个

我们需要在末尾的位置不断地插入结点,操作是动态分配一个Node的结点,coef和exp赋值到结点,然后pos是len+1,即插入到末尾,并且len++

输入函数

void Input() {
		int number,coef,exp;
		cout << "请输入多项式的项数:";
		cin >> number;
		for (int i = 0; i < number; i++) {
			cout << "请输入第" << (i + 1) << "项的系数:" << endl;
			cin >> coef;
			cout << "请输入第" << (i + 1) << "项的指数:" << endl;
			cin >> exp;
			//插入
			Insert(len+1, coef, exp);
		}
	}

​ 输入函数需要嵌套Insert函数使用,在链表的末尾不断地插入结点,使他变成一个完整的链表结构

相加函数

void Add(Polynomial x, Polynomial y) {
		Node* pa = x.head->next;//pa指针指向a的第一个结点
		Node* pb = y.head->next;//pb指针指向b的第一个结点
		while ((pa != NULL) && (pb != NULL)) {
			//第一种情况
			if (pa->exp < pb->exp) {
				Insert(len + 1, pa->coef, pa->exp);
				pa = pa->next;//后移一格
			}
			//第二种情况
			else if (pa->exp > pb->exp) {
				Insert(len + 1, pb->coef, pb->exp);
				pb = pb->next;//后移一格
			}
			else if (pa->exp == pb->exp) {
				int temp = pa->coef + pb->coef;
				if (temp!=0) {//如果相加不为零
					Insert(len + 1, temp, pa->exp);
				}
				pa = pa->next;//后移一格
				pb = pb->next;//后移一格
			}
		}
		pa = (pa == NULL) ? pb : pa;
		while (pa != NULL) {
			Insert(len + 1, pa->coef, pa->exp);
			pa = pa->next;//后移
		}
	}

​ 可以说这是最核心的代码了,我的做法是传入两个类,然后再对这两个链表进行处理

如果exp_a<exp_b,那么需要使a的这个结点连接到c上

如果exp_a>exp_b,那么需要使b的这个结点连接到c上

如果exp_a=exp_b,那么需要使a的这个结点加上b的这个结点连接到一起,再连接到c上

并使它们不断地后移,直到一个为空,一个空了就把另一个剩下的连接到c上,就完成了

主函数

int main()
{
	//定义三个类
	Polynomial a;
	Polynomial b;
	Polynomial c;
	//对三个类进行初始化
	a.Init();
	b.Init();
	c.Init();
	//先输入a和b
	a.Input();
	b.Input();
	//多项式相加
	c.Add(a, b);
	//输出abc
	a.Output();
	b.Output();
	c.Output();
}

​ 好,多项式相加是不是很简单呢