C++利用单链表实现一元多项式的加、乘操作

提示:一元多项式中的数据项含有两个数据分别是系数与指数,为了简单起见,系数与指数都为整数。

定义单链表的数据结构和结点的数据结构。


#include <iostream.h>

typedef struct
{
	int xi;//系数
	int zhi;//指数
}unit;

typedef struct LNode
{
	unit data; //结点的数据部分
	struct LNode *next;
} LinkList;

1.初始化单链表

//初始化链表
void InitList(LinkList *&L)
{
	L = new LinkList;
	L->next = NULL;
}

2.插入结点到有序单链表中

根据指数的大小,从大到小进行插入

void InsertList(LinkList *&L,unit e)
{
	LinkList *r,*s;//r是循环用的结点指针,s是插入的新结点
	r = L;
	//寻找新插入结点的位置
	while(r->next!=NULL && e.zhi < r->next->data.zhi)//以指数决定插入的位置
		r = r->next;
	if(r->next != NULL && e.zhi == r->next->data.zhi)//指数相等
		r->next->data.xi += e.xi;  //系数相加
	else
	{
		s = new LinkList;
		s->data.xi = e.xi;	s->data.zhi = e.zhi;
	//将e的值赋给s指针所指结点
		s->next = r->next;
		r->next = s;
	}
}

3.遍历单链表

一元多项式存在多种特殊情况

第一种特殊情况:系数为1,指数为0,只输出1。

第二种特殊情况:指数为1时,输出‘X’。

//遍历线性表
void DispList(LinkList *L)
{
	LinkList *p = L->next;
	int j = 0;
	while(p)
	{
		if(p->data.xi == 1 && p->data.zhi == 0)//系数为1,指数为0
		   cout<<"1";
		if(p->data.xi != 0 && p->data.xi != 1)
			cout<<p->data.xi;
		if(p->data.xi != 0)
		{
			if(p->data.zhi > 1)
				cout<<"X^"<<p->data.zhi;
			else if(p->data.zhi < 0)
				cout<<"X^("<<p->data.zhi<<')';
			else
				if(p->data.zhi == 1)
					cout<<'X';
		}
		if(p->next != NULL && p->next->data.xi > 0)
			cout<<'+';
		p = p->next;

	}
	cout<<endl;
}

4.两个多项式相加

在单链表L的基础上,进行相加。

//两个多项式相加
void AddList(LinkList *&L,LinkList *Lc)
{
	LinkList *b = Lc->next;
	while(b != NULL)
	{
		InsertList(L,b->data);//从Lc表中取出每一个节点插入到L中
		b = b->next;
	}
}

5.两个多项式相乘

单链表Lc的一个项的系数和指数需要乘以单链表Lb的所有项,将相乘得到的数据存入一个新表La,之后再由单链表Lc的下一个项进行操作。

void Cheng(LinkList *&La,LinkList *&Lb,LinkList *Lc)
{
	LinkList *b,*c = Lc->next;
	unit e;
	while(c != NULL)  //取Lc表中的每一个节点
	{
		b = Lb->next;  
		while(b != NULL)   //取Lb表中的每一个节点
		{
			e.xi = c->data.xi * b->data.xi;    //系数相乘
			e.zhi = c->data.zhi + b->data.zhi;   //指数相加,得到节点相乘的值 
			InsertList(La,e);  //再将该节点插入到La中
			b = b->next;
		}
		c = c->next;
	}
}

=================================================

主函数

因为要生成有两个多项式,所以外循环 while 代表多项式的个数。

void main()
{
	LinkList *La,*Lb,*L;
	InitList(La);InitList(Lb);InitList(L);
	int i,j = 0;
	unit k;
	while(j++ < 2)
	{
		i = 0;
		do
		{		
			cout<<"请输入第"<<j<<"个多项式第"<<++i<<"项的系数(按0退出):";
			cin>>k.xi;
			cout<<"请输入第"<<j<<"个多项式第"<<i<<"项的指数:";
			cin>>k.zhi;
			cout<<endl;
			if(j == 1)
				if(k.xi != 0)
					InsertList(La,k);
			if(j == 2)
				if(k.xi != 0)
					InsertList(Lb,k);
		}while(k.xi != 0);
	}
	cout<<"第一个一元多项式为:F(X)=";DispList(La);
	cout<<"第二个一元多项式为:G(X)=";DispList(Lb);
	cout<<"多项式相乘为:";
	Cheng(L,La,Lb);
	DispList(L);
	cout<<"多项式相加为:";
	AddList(La,Lb);
	DispList(La);
}

  • 14
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
下面是单链表实现一元多项式的基本操作C++代码: ```cpp #include<iostream> using namespace std; struct node { int coef; // 系数 int exp; // 指数 node *next; // 下一个节点 }; class Polynomial { private: node *head; // 链表头节点 public: // 构造函数 Polynomial() { head = new node; head->next = NULL; } // 析构函数 ~Polynomial() { node *temp = head->next; while (temp != NULL) { node *p = temp; temp = temp->next; delete p; } delete head; } // 插入节点 void insert(int coef, int exp) { node *p = new node; p->coef = coef; p->exp = exp; p->next = NULL; node *temp = head; while (temp->next != NULL && temp->next->exp > exp) { temp = temp->next; } if (temp->next != NULL && temp->next->exp == exp) { temp->next->coef += coef; if (temp->next->coef == 0) { node *q = temp->next; temp->next = q->next; delete q; } } else { p->next = temp->next; temp->next = p; } } // 输出多项式 void print() { node *temp = head->next; while (temp != NULL) { if (temp != head->next && temp->coef > 0) { cout << "+"; } if (temp->coef != 1 || temp->exp == 0) { cout << temp->coef; } if (temp->exp > 0) { cout << "x^" << temp->exp; } temp = temp->next; } cout << endl; } // 多项式法 Polynomial add(Polynomial b) { Polynomial c; node *p = head->next; node *q = b.head->next; while (p != NULL && q != NULL) { if (p->exp > q->exp) { c.insert(p->coef, p->exp); p = p->next; } else if (p->exp < q->exp) { c.insert(q->coef, q->exp); q = q->next; } else { c.insert(p->coef + q->coef, p->exp); p = p->next; q = q->next; } } while (p != NULL) { c.insert(p->coef, p->exp); p = p->next; } while (q != NULL) { c.insert(q->coef, q->exp); q = q->next; } return c; } // 多项式减法 Polynomial sub(Polynomial b) { Polynomial c; node *p = head->next; node *q = b.head->next; while (p != NULL && q != NULL) { if (p->exp > q->exp) { c.insert(p->coef, p->exp); p = p->next; } else if (p->exp < q->exp) { c.insert(-q->coef, q->exp); q = q->next; } else { c.insert(p->coef - q->coef, p->exp); p = p->next; q = q->next; } } while (p != NULL) { c.insert(p->coef, p->exp); p = p->next; } while (q != NULL) { c.insert(-q->coef, q->exp); q = q->next; } return c; } // 多项式乘法 Polynomial mul(Polynomial b) { Polynomial c; node *p = head->next; while (p != NULL) { node *q = b.head->next; while (q != NULL) { int coef = p->coef * q->coef; int exp = p->exp + q->exp; c.insert(coef, exp); q = q->next; } p = p->next; } return c; } }; int main() { Polynomial a, b, c; int n, coef, exp; cout << "输入第一个多项式的项数:" << endl; cin >> n; cout << "输入第一个多项式的系数和指数:" << endl; for (int i = 0; i < n; i++) { cin >> coef >> exp; a.insert(coef, exp); } cout << "第一个多项式为:" << endl; a.print(); cout << "输入第二个多项式的项数:" << endl; cin >> n; cout << "输入第二个多项式的系数和指数:" << endl; for (int i = 0; i < n; i++) { cin >> coef >> exp; b.insert(coef, exp); } cout << "第二个多项式为:" << endl; b.print(); c = a.add(b); cout << "两个多项式的和为:" << endl; c.print(); c = a.sub(b); cout << "两个多项式的差为:" << endl; c.print(); c = a.mul(b); cout << "两个多项式的积为:" << endl; c.print(); return 0; } ``` 在该代码中,`node` 结构体表示链表节点,包含系数、指数和下一个节点指针。`Polynomial` 类表示多项式,包含链表头节点和一些基本操作函数,例如插入节点、输出多项式、多项式法、多项式减法、多项式乘法等。在主函数中,用户输入两个多项式的项数、系数和指数,然后执行、减、乘操作,并输出结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

henry594小李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值