栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构实验-稀疏一元多项式计算

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构实验-稀疏一元多项式计算

(实验)自行为稀疏一元多项式设计存储结构,并实现如下功能:
① 输入:从键盘输入多项式的各项系数和指数,创建一元多项式;
② 输出:按给定格式输出一元多项式;(例如:3*x20-x7+10)
③ 多项式加法: 任意输入另一个多项式,输出其与原多项式的和。
④ 多项式减法: 任意输入另一个多项式,将其作为减数输出其与原多项式的差。
⑤ 多项式乘法: 任意输入另一个多项式,输出其与原多项式的积。

#include 
using namespace std;
typedef struct LNode
{
	int coef;					//系数
	int expn;					//指数
	struct LNode* next;			//节点的指针域
}LNode,*linkList;           //linkList为指向结构体LNode的指针类型

//单链表的初始化
linkList InitList(linkList &L) {
	L = new LNode;          //生成头结点
	L->next = NULL;         //头结点的指针域置为空
	return L;
}


//单链表的创建
linkList CreatList(linkList& L) {
	L->next = NULL;
    int n = 0;
	cout << "请输入要创建的多项式有几项" << endl;
	cin >> n;
    for(int i = 0;i> c;
        p->coef = c;
        cout << "指数:" << endl;	//录入指数
        int e = 0;
        cin >> e;
        p->expn = e;
        p->next = L->next;
        L->next = p;
    }
    return L;
}
//单链表的创建(重载函数)
linkList CreatList(linkList& L,int num) {
	L->next = NULL;
	int n = 0;
	for (int i = 0; i < n; i++)
	{
		LNode* p = new LNode;

		cout << "系数:" << endl;
		int c = 0;
		cin >> c;
		p->coef = c;
		cout << "指数:" << endl;
		int e = 0;
		cin >> e;
		p->expn = e;

		p->next = L->next;
		L->next = p;
	}
	return L;
}

//多项式的加法
linkList add(linkList L1, linkList L2, linkList& L) {
	LNode* a = L1->next;
	LNode* b = L2->next;
	L->next = NULL;
	LNode* p = new LNode;
	while (a&&b) {
		LNode* temp = new LNode;
		if (a->expn == b->expn) {	//指数相等时,系数相加
			temp->coef = a->coef + b->coef;
			temp->expn = a->expn;

			temp->next = L->next;
			L->next = temp;

			a = a->next;
			b = b->next;

		}
		else if (a->expn > b->expn) {	//a的指数大于b时
			temp->coef = b->coef;
			temp->expn = b->expn;
			temp->next = L->next;
			L->next = temp;
			b = b->next;
		}
		else {							//b的指数大于a时
			temp->coef = a->coef;
			temp->expn = a->expn;
			temp->next = L->next;
			L->next = temp;
			a = a->next;
		}
	}
	if (a) {							//当b遍历完而a还未结束时,把a剩下的部分加上
		while (a->next !=NULL)
		{
			p->coef = a->coef;
			p->expn = a->expn;
			p->next = L->next;
			L->next = p;
			a = a->next;
		}

	}
	else {								//当a遍历完而b还未结束时,把b剩下的部分加上
		while (b)
		{
			p->coef = b->coef;
			p->expn = b->expn;
			p->next = L->next;
			L->next = p;
			b = b->next;
		}
	}
	return L;
}

//多项式相减
linkList subtraction(linkList L1, linkList L2, linkList& L) {
	LNode* a = L1->next;
	LNode* b = L2->next;
	L->next = NULL;
	LNode* p = new LNode;
	while (a && b) {
		LNode* temp = new LNode;
		if (a->expn == b->expn) {					//指数相等时,系数相减
			temp->coef = a->coef - b->coef;
			temp->expn = a->expn;

			temp->next = L->next;
			L->next = temp;

			a = a->next;
			b = b->next;

		}
		else if (a->expn > b->expn) {				//a的指数大于b时

			temp->coef = -b->coef;
			temp->expn = b->expn;
			temp->next = L->next;
			L->next = temp;
			b = b->next;
		}
		else {										//b的指数大于a时
			temp->coef = a->coef;
			temp->expn = a->expn;
			temp->next = L->next;
			L->next = temp;
			a = a->next;
		}
	}
	if (a) {
		while (a->next != NULL)						//当b遍历完而a还未结束时,把a剩下的部分加上
		{
			p->coef = a->coef;
			p->expn = a->expn;
			p->next = L->next;
			L->next = p;
			a = a->next;
		}

	}
	else {											//当a遍历完而b还未结束时,加上b剩下的部分的相反数
		while (b)
		{
			p->coef = -b->coef;
			p->expn = b->expn;
			p->next = L->next;
			L->next = p;
			b = b->next;
		}
	}
	return L;
}

//多项式相乘
linkList MultiplyPolyn(linkList L1, linkList L2, linkList& L)	
{
	L = L1;
	linkList p1, p2, p3, p;
	p1 = L1->next;
	L->next = NULL;
	int sum;	//保存指数相加的结果
	for (; p1; p1 = p1->next)	//循环p1的每一个结点
	{
		for (p2 = L2->next; p2; p2 = p2->next)	//循环p2的每一个结点
		{
			p3 = L;	
			sum = p1->expn + p2->expn;		//保存指数相加的结果
			while (p3->next && p3->next->expn > sum)	//当p3存在,并且指数小于计算的,p3后移
			{
				p3 = p3->next;
			}
			if (p3->next && p3->next->expn == sum)	//当p3存在,并且指数等于计算的,p3系数加上计算的系数
			{
				p3->next->coef += (p1->coef * p2->coef);
			}
			else	//否则将计算后的结果插入p3
			{
				p = new LNode;
				p->expn = sum;
				p->coef = p1->coef * p2->coef;
				p->next = p3->next;
				p3->next = p;
			}
		}
	}
	delete L2;	
	return L;
}

//打印多项式
void ListPrint(linkList& L) {
	LNode* p = L;
	while (p->next != NULL) {
		cout << p->next->coef << "*X^" << p->next->expn;
		if (p->next->coef<0 && p->next->next)
		{
			cout << "-";
		}
		else if (p->next->coef > 0 && p->next->next) {
			cout << "+";
		}
		p = p->next;
	}
	cout << endl;
}

int main() {
	linkList L1,L2,L3;
	//初始化
	L1 = InitList(L1);
	L2 = InitList(L2);
	L3 = InitList(L3);
	//创建
	L1 = CreatList(L1);
	ListPrint(L1);
	L2 = CreatList(L2);
	ListPrint(L2);
	L3 = CreatList(L3, 0);
	ListPrint(L3);
	//多项式相加
	L3 = add(L1,L2,L3);
	cout << "相加得:";
	ListPrint(L3);
	//多项式相减
	L3 = subtraction(L1, L2, L3);
	cout << "相减得:";
	ListPrint(L3);
	//多项式相乘
	cout << "相乘得:";
	L3 = MultiplyPolyn(L1, L2, L3);
	ListPrint(L3);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/316066.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号