一起养成写作习惯!这是我参与「掘金日新计划 · 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();
}
好,多项式相加是不是很简单呢