单链表的应用:多项式及其运算(代码来自课本)

#ifndef POLYNOMAL_H
#define POLYNOMAL_H
#include
using namespace std;
//多项式结点的定义
struct Term {
float coef;//系数
int exp;//指数
Term* link;//链指针
Term(float c, int e, Term* next = NULL)//初始化
{
coef = c;
exp = e;
link = next;
}
Term* InsertAfter(float c, int e);//在当前由this指针指示的项后面插入一个新项

friend ostream& operator<<(ostream&, const Term&);
};

//多项式类的定义
class Polynomial
{
public:
Polynomial()//构造函数,建立空链表
{
first = new Term(0, -1);//头指针为link=next(默认)=NULL
}
Polynomial(Polynomial& R);//复制构造函数
int maxOrder();//计算最大阶数
Term* getHead()const { return first; }//取得多项式单链表的表头指针
friend ostream& operator<<(ostream&out,const Term& x)//输出运算符重载函数的第一个形参必须是ostream或istream类型,而成员函数的第一个形参是默认的(即this指针)
{ //Term的友元函数:输出一个项x的内容到输出流out中。
if (x.coef == 0.0)
return out;
out << x.coef;
switch (x.exp)
{
case 0:break;
case 1:out << “X”; break;
default:out << “X^” << x.exp;
break;
}
return out;
}
private:
Term * first;//头指针getHead()获得
friend ostream& operator<<(ostream&, const Polynomial&);
friend istream& operator>>(istream&, Polynomial&);
friend Polynomial operator +(Polynomial&, Polynomial&);
friend Polynomial operator *(Polynomial&, Polynomial&);
};

//在当前由this指针指示的项后面插入一个新项
Term* Term::InsertAfter(float c, int e)
{
link= new Term(c, e, link);//创建一个新结点,自动链接
return link;//插入到this当前结点后面
}

//复制构造函数:用已有多项式对象R初始化当前多项式对象R。
Polynomial::Polynomial(Polynomial &R)
{
first = new Term(0, -1);//用结点类构造函数初始化头指针NULL,建立一个空链表
Term *destptr = first, srcptr = R.getHead()->link;
while (srcptr != NULL)
{
destptr->InsertAfter(srcptr->coef, srcptr->exp);
//在destptr所指结点后插入新结点,再让destptr指到这个新结点
srcptr = srcptr->link;
destptr = destptr->link;
}
}
//计算最大阶数,当多项式按升序排列时,最后一项中是指数最大者
int Polynomial::maxOrder()
{
Term
current = first;
while (current->link != NULL)
current = current->link;
//空表情形,current停留在first,否则current停留在表尾结点。
return current->exp;//最大指数
}

// Polynomal类的友元函数:从输入流In输入各项,用尾插法建立一个多项式。
istream& operator>>(istream& in, Polynomial& x)
{
Term* rear = x.getHead();//rear是尾指针
float c;
int e;
while (1)
{
cout << “input a term(coef,exp):” << endl;
in >> c >> e; //输入项的系数c和指数e
if (e<0) break; //用e<0控制输入结束
rear = rear->InsertAfter(c, e);//链接到rear所指结点后
}
return in;
}

//Polynomal类的友元函数:输出带附加头结点的多项式链表x.
ostream&operator<<(ostream&out, Polynomial&x)
{
Term*current = x.getHead()->link;
cout << “the polynomal is:” << endl;
bool h = true;
while (current != NULL)
{
if (h == false && current->coef>0.0)
out << “+”;
h = false;
out << *current;//调用Term类的重载输出函数
current = current->link;
}
out << endl;
return out;
}

//两个多项式相加的计算
Polynomial operator+(Polynomial& A, Polynomial& B)
{
Term* pa, *pb, *pc, *p;//创建结点
float temp;
Polynomial C;
pc = C.first;//初始链表的头指针
pa = A.getHead()->link;//多项式的第一个结点即第一项
pb = B.getHead()->link;
while (pa != NULL && pb != NULL)
{
if (pa->exp == pb->exp)
{
temp = pa->coef + pb->coef;
if (fabs(temp) > 0.001)
pc = pc->InsertAfter(temp, pa->exp);
pa = pa->link; pb = pb->link;
}
else if (pa->exp < pb->exp)//pa指数小
{
pc = pc->InsertAfter(pa->coef, pa->exp);
pa = pa->link;
}
else
{
pc = pc->InsertAfter(pb->coef, pb->exp);
pb = pb->link;
}
}
if (pa != NULL)//p显示剩余链的地址
p = pa;
else p = pb;
while (p != NULL)//处理剩余链部分
{
pc = pc->InsertAfter(p->coef, p->exp);
p = p->link;
}
return C;
}

//两个多项式相乘的计算
//将一元多项式A和B相乘,乘积用带附带头结点的单链表存储,返回值为指向存储乘积多项式的
Polynomial operator *(Polynomial&A, Polynomial&B)
{
//单链表的头指针
Term *pa, pb, pc;
int AL, BL, i, k, maxExp;
Polynomial C;//结果多项式
pc = C.getHead();
AL = A.maxOrder();
BL = B.maxOrder();//两个多项式的阶数
if (AL != -1 || BL != -1)
{
maxExp = AL + BL;
float
result = new float[maxExp + 1];
for (i = 0; i <= maxExp; i++) { result[i] = 0.0; }
pa = A.getHead()->link;
while (pa != NULL)
{
pb = B.getHead();
while (pb != NULL)
{
k = pa->exp + pb->exp;
result[k] = result[k] + pa->coef
pb->coef;
pb = pb->link;
}
pa = pa->link;
}
for (i = 0; i <= maxExp; i++)
{
if (fabs(result[i]) > 0.001)
pc = pc->InsertAfter(result[i], i);
delete[] result;
}
}
pc->link = NULL;
return C;
}
#endif

//测试:
#include
#include"Polynomal.h"
using namespace std;
int main()
{
Polynomial A, B,C,D;
cin >> A >> B;
C = A + B;
D= A * B;
cout << C << endl;
cout << D << endl;
system(“pause”);
return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单链表存储一元多项式的结构体如下: ```c typedef struct node { float coef; // 系数 int expn; // 指数 struct node *next; }Node, *Polynomial; ``` 其中,`coef`表示多项式的系数,`expn`表示多项式的指数,`next`表示下一个节点的指针。 以下是求两个多项式的加减乘法运算的完整代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct node { float coef; // 系数 int expn; // 指数 struct node *next; }Node, *Polynomial; // 创建多项式 Polynomial createPolynomial() { Polynomial head = (Polynomial)malloc(sizeof(Node)); head->next = NULL; return head; } // 添加节点 void addNode(Polynomial polynomial, float coef, int expn) { Polynomial p = polynomial; while (p->next && p->next->expn > expn) { p = p->next; } if (p->next && p->next->expn == expn) { p->next->coef += coef; if (p->next->coef == 0) { Polynomial tmp = p->next; p->next = tmp->next; free(tmp); } } else { Polynomial node = (Polynomial)malloc(sizeof(Node)); node->coef = coef; node->expn = expn; node->next = p->next; p->next = node; } } // 打印多项式 void printPolynomial(Polynomial polynomial) { Polynomial p = polynomial->next; while (p) { if (p->coef > 0) { printf("+%.2fx^%d", p->coef, p->expn); } else if (p->coef < 0) { printf("%.2fx^%d", p->coef, p->expn); } p = p->next; } printf("\n"); } // 加法 Polynomial addPolynomial(Polynomial p1, Polynomial p2) { Polynomial res = createPolynomial(); Polynomial p = p1->next; while (p) { addNode(res, p->coef, p->expn); p = p->next; } p = p2->next; while (p) { addNode(res, p->coef, p->expn); p = p->next; } return res; } // 减法 Polynomial subPolynomial(Polynomial p1, Polynomial p2) { Polynomial res = createPolynomial(); Polynomial p = p1->next; while (p) { addNode(res, p->coef, p->expn); p = p->next; } p = p2->next; while (p) { addNode(res, -p->coef, p->expn); p = p->next; } return res; } // 乘法 Polynomial mulPolynomial(Polynomial p1, Polynomial p2) { Polynomial res = createPolynomial(); Polynomial p = p1->next; while (p) { Polynomial q = p2->next; while (q) { addNode(res, p->coef * q->coef, p->expn + q->expn); q = q->next; } p = p->next; } return res; } int main() { // 创建多项式 Polynomial p1 = createPolynomial(); Polynomial p2 = createPolynomial(); // 添加节点 addNode(p1, 2, 3); addNode(p1, 3, 2); addNode(p1, 5, 0); addNode(p2, 1, 3); addNode(p2, -2, 2); addNode(p2, 3, 1); addNode(p2, 4, 0); // 打印多项式 printf("多项式1:"); printPolynomial(p1); printf("多项式2:"); printPolynomial(p2); // 加法 Polynomial p3 = addPolynomial(p1, p2); printf("多项式1 + 多项式2:"); printPolynomial(p3); // 减法 Polynomial p4 = subPolynomial(p1, p2); printf("多项式1 - 多项式2:"); printPolynomial(p4); // 乘法 Polynomial p5 = mulPolynomial(p1, p2); printf("多项式1 * 多项式2:"); printPolynomial(p5); return 0; } ``` 输出结果如下: ``` 多项式1:+2.00x^3+3.00x^2+5.00 多项式2:+1.00x^3-2.00x^2+3.00x^1+4.00 多项式1 + 多项式2:+3.00x^3+1.00x^2+3.00x^1+9.00 多项式1 - 多项式2:+1.00x^3+5.00x^2-3.00x^1+1.00 多项式1 * 多项式2:+2.00x^6-1.00x^5+7.00x^4-16.00x^3+23.00x^2+31.00x^1+20.00 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值