ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【单链表】一元多项式求和(C++)

2021-10-22 18:59:49  阅读:178  来源: 互联网

标签:单链 int 多项式 C++ next L2 exp L1 LinkNode


一元多项式求和

要求&&实现流程

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

#include<iostream>
using namespace std;

typedef struct LinkNode
{
	int cofe;//系数
	int  exp;//次方
	struct LinkNode* next;
}LinkList,LinkNode;

//初始化链表
void initLinkList(LinkList*& L)
{	
	L = new LinkList;
	L->next = NULL;
}
//尾插
void LinkPushBack(LinkList* L, int _cofe, int _exp)
{
	LinkNode* node = new LinkNode;
	node->cofe = _cofe;
	node->exp = _exp;

	LinkNode* temp = L;
	while (temp->next)
	{
		temp = temp->next;
	}
	temp->next = node;
	node->next = NULL;
}

//输入数据
void inputPoly(LinkList* L1, LinkList* L2)
{
	//系数,次方
	int l1cofe = 0;
	int l2cofe = 0;
	int l1exp = 0;
	int l2exp = 0;

	//几项式
	int l1num = 0;
	int l2num = 0;

	cout << "第一个多项式有几项?" << endl;
	cin >> l1num;
	for (int i = 0; i < l1num; i++)
	{
		cout << "请输入第"<<i+1<<"项的系数:" << endl;
		cin >> l1cofe;
		cout << "请输入第" << i+1 << "项的次方:" << endl;
		cin >> l1exp;
		LinkPushBack(L1, l1cofe, l1exp);
	}
	cout << "第一个多项式输入完毕!" << endl;

	cout << "第二个多项式有几项?" << endl;
	cin >> l2num;
	for (int i = 0; i < l2num; i++)
	{
		cout << "请输入第" << i+1<< "项的系数:" << endl;
		cin >> l2cofe;
		cout << "请输入第" << i+1 << "项的次方:" << endl;
		cin >> l2exp;
		LinkPushBack(L2, l2cofe, l2exp);
	}
	cout << "第二个多项式输入完毕!" << endl;
	cout << "多项式输入完毕!" << endl;
}

//多项式求和运算
void sumList(LinkList* L1, LinkList* L2)
{
	LinkNode* p = L1->next;//p为结果链表
	LinkNode* q = L2->next;
	LinkNode* pFront = L1;
	LinkNode* qFront = L2;
	//cofe系数
	//exp次方

	while (q && p)
	{
		if (p->exp == q->exp)//是同类项,可以合并,结果合并到p中
		{
			p->cofe += q->cofe;
			LinkNode* temp = new LinkNode;
			//删除q的结点
			temp = q;
			qFront->next = temp->next;
			delete temp;

			//工作指针后移
			pFront = p;
			p = p->next;

			q = qFront->next;
		}
		else if(p->exp < q->exp)//结果链表对应次方比q链表对应结点次方小,结果链表中工作指针后移
		{
			pFront = p;
			p = p->next;
		}
		else if(p->exp > q->exp)//结果链表对应次方比q链表对应结点次方大,q对应结点插过来。
		{
			//将这个结点插入到结果结点中

			qFront->next = q->next;
			pFront->next = q;
			q->next = p;
			
			q = qFront->next;//重新回到对应链表
			//结果链表的前指针后移
			pFront = pFront->next;
		}
	}
	//如果多项式L2的长度大于L1的,此时结束时,L2还有没遍历到的结点,次方大于L1所有的结点,直接插入到结果链表(L1)尾部
	if (q)//加个判断条件防止,L1最后一个项,系数大于L2的,也进入下面这个循环
	{
		while (q)
		{
			pFront->next = q;
			pFront = pFront->next;
			q = q->next;
		}
		pFront->next = NULL;//链接完成后尾结点next域置空
	}
	L2->next = NULL;//到达这里,L2除了head结点之外,后面的就算有内容也不属于它了。

	cout << "相加结果为:" << endl;
	L1 = L1->next;
	while (L1)
	{
		cout << "(" << L1->cofe << "," << L1->exp << ")" << " ";
		L1 = L1->next;
	}	
}
//销毁链表
void destoryLink(LinkNode*& L)
{
	LinkNode* tempNode = L;
	while (tempNode)
	{
		L = L->next;
		delete tempNode;
		tempNode = L;
	}
}
int main(void)
{
	LinkList* L1;
	LinkList* L2;
	initLinkList(L1);
	initLinkList(L2);
	
	inputPoly(L1, L2);
	sumList(L1, L2) ;

	destoryLink(L1);
	destoryLink(L2);

	return 0;
}

输出结果
在这里插入图片描述

标签:单链,int,多项式,C++,next,L2,exp,L1,LinkNode
来源: https://blog.csdn.net/qq_51604330/article/details/120909542

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有