1_简答的多项式运算

2017-4-10 18:44:22 (转载)

最近再重新补上数据结构,看到数字的习题就练练手吧

书上要求的是用链表实现的,看着别人写的好的自己手打一遍,练练手

#include "stdafx.h"
#include<conio.h>  
#include<stdlib.h>
#include<iostream>  
using namespace std;
struct Node   
{
	float coef;  //系数  
	int exp;     //指数  
};

typedef Node polynomial;//重命名  

struct LNode
{
	polynomial data;//链表类型   Node data
	LNode *next;
};
typedef LNode* Link;
void Create(Link &L, int n);  //创建一个n项多项式函数  
void Print(Link L);          //输出链表函数  
void Add(Link &pc, Link pa, Link pb); //多项式相加函数  
void Substract(Link &pc, Link pa, Link pb);//多项式相减函数  
void Copy(Link &pc, Link pa);//把一个链表的内容复制给另一个链表创建表函数  
int Judge(Link pa, Link e);//判断指数是否与多项式中已存在的某项相同函数  

void Destroy(Link& L)
{
	Link p;
	p = L->next;
	while (p != NULL)
	{
		L->next = p->next;
		delete p;
		p = L->next;
	}

	delete L;
	L = NULL;
}

void Create(Link& L, int n)//创建有n个结点的多项式
{
	if (L != NULL)
		Destroy(L);

	Link p, newp;//先定义两个链表
	L = new LNode();
	L->next = NULL;
	L->data.exp = -1;//头结点
	p = L;
	for (int i = 0; i < n; i++)
	{
		newp = new LNode();
		cout << "请输入第" << i +1<< "项的系数和指数:" << endl;
		cout << "系数:";
		cin >> (newp->data).coef;
		cout << "指数:";
		cin >> (newp->data).exp;
		if (newp->data.exp<0) //判断指数是否为0,如果为0,销毁链表,从新输入  
		{
			cout << "您输入有误,指数不允许为负值!" << endl;
			delete newp;
			i--;
			continue;
		}
		newp->next = NULL;
		p = L;
		if (newp->data.coef == 0)//判断系数是否为0  
		{
			cout << "系数为零,重新输入!" << endl;
			delete newp;
			i--;
			continue;
		}

		while ((p->next != NULL) && ((p->next->data).exp<(newp->data).exp)) //利用while循环使p指向指数最小的项  
		{
			p = p->next;
		}

		if (!Judge(L, newp))
		{
			newp->next = p->next;
			p->next = newp;
		}
		else
		{
			cout << "输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项式" << endl;
			delete newp;
			Destroy(L);
			Create(L, n); //创建多项式没有成功,递归调用重新创建  
			break;
		}

	}
}

int Judge(Link L, Link e)//判断指数是否与多项式中已存在的某项相同  
{
	Link p;
	p = L->next;
	while (p != NULL && (e->data.exp != p->data.exp))
		p = p->next;
	if (p == NULL)return 0;
	else return 1;
}

void Print(Link L)//输出链表  
{
	Link p;
	if (L == NULL || L->next == NULL)   //判断多项式是否为空  
		cout << "该一元多项式为空!" << endl;
	else
	{
		p = L->next;
		if ((p->data).coef>0)  //项的系数大于的种情况  
		{
			if ((p->data).exp == 0)  //输出指数为0项的系数  
				cout << (p->data).coef;
			else if ((p->data).coef == 1 && (p->data).exp == 1)
				cout << "x";
			else if ((p->data).coef == 1 && (p->data).exp != 1)
				cout << "x^" << (p->data).exp;
			else if ((p->data).exp == 1 && (p->data).coef != 1)
				cout << (p->data).coef << "x";
			else cout << (p->data).coef << "x^" << (p->data).exp;
		}
		//项的系数小于的种情况  
		if ((p->data).coef<0)
		{
			if ((p->data).exp == 0)
				cout << (p->data).coef;
			else if (p->data.coef == -1 && p->data.exp == 1)
				cout << "-x";
			else if (p->data.coef == -1 && p->data.exp != 1)
				cout << "-x^" << p->data.exp;
			else if (p->data.exp == 1)
				cout << p->data.coef << "x";
			else cout << (p->data).coef << "x^" << (p->data).exp;
		}
		p = p->next;
		while (p != NULL)
		{
			if ((p->data).coef>0)
			{
				if ((p->data).exp == 0)
					cout << " " << (p->data).coef;
				else if ((p->data).exp == 1 && (p->data).coef != 1)
					cout << " " << (p->data).coef << "x";
				else if ((p->data).exp == 1 && (p->data).coef == 1)
					cout << " " << "x";
				else if ((p->data).coef == 1 && (p->data).exp != 1)
					cout << " " << "x^" << (p->data).exp;
				else cout << " " << (p->data).coef << "x^" << (p->data).exp;
			}
			if ((p->data).coef<0)
			{
				if ((p->data).exp == 0)
					cout << (p->data).coef;
				else if (p->data.coef == -1 && p->data.exp == 1)
					cout << "-x";
				else if (p->data.coef == -1 && p->data.exp != 1)
					cout << "-x^" << p->data.exp;
				else if (p->data.exp == 1)
					cout << p->data.coef << "x";
				else cout << (p->data).coef << "x^" << (p->data).exp;
			}

			p = p->next;
		}
	}
	cout << endl;
}
void Copy(Link &pc, Link pa)//把一个链表的内容复制给另一个链表  
{
	Link p, q, r;
	pc = new LNode;
	pc->next = NULL;
	r = pc;
	p = pa;
	while (p->next != NULL)
	{
		q = new LNode;
		q->data.coef = p->next->data.coef;
		q->data.exp = p->next->data.exp;
		r->next = q;
		q->next = NULL;
		r = q;
		p = p->next;
	}
}

void Add(Link &pc, Link pa, Link pb)//两个一元多项式相加  
{
	Link p1, p2, p, pd;
	Copy(p1, pa);
	Copy(p2, pb);
	pc = new LNode;
	pc->next = NULL;
	p = pc;
	p1 = p1->next;
	p2 = p2->next;
	while (p1 != NULL&&p2 != NULL)
	{
		if (p1->data.exp<p2->data.exp)//比较指数大小,把两个一元多项式的项按指数递增序列排列  
		{
			p->next = p1;
			p = p->next;
			p1 = p1->next;
		}
		else if (p1->data.exp>p2->data.exp)
		{
			p->next = p2;
			p = p->next;
			p2 = p2->next;
		}
		else //当指数相同时两系数相加  
		{
			p1->data.coef = p1->data.coef + p2->data.coef;
			if (p1->data.coef != 0)//找出系数为零的项并删除  
			{
				p->next = p1;
				p = p->next;
				p1 = p1->next;
				p2 = p2->next;
			}
			else
			{
				pd = p1;
				p1 = p1->next;
				p2 = p2->next;
				delete pd;
			}

		}
	}
	if (p1 != NULL)
	{
		p->next = p1;
	}
	if (p2 != NULL)
	{
		p->next = p2;
	}
}

void Substract(Link &pc, Link pa, Link pb)//两个多项式相减  
{
	Link p, pt;
	Copy(pt, pb);//把pb复制在pt  
	p = pt;
	while (p != NULL)
	{
		(p->data).coef = (-(p->data).coef);//将系数取反  
		p = p->next;
	}
	Add(pc, pa, pt);//调用加法函数进行减法  
	Destroy(pt);
}

void Multiply(Link &pc, Link pa, Link pb)//将两个一元多项式相乘函数  
{
	Link p1, p2, p, pd, newp, t;
	pc = new LNode;
	pc->next = NULL;
	p1 = pa->next;
	p2 = pb->next;
	while (p1 != NULL)
	{
		pd = new LNode;
		pd->next = NULL;
		p = new LNode;
		p->next = NULL;
		t = p;
		while (p2)
		{
			newp = new LNode;
			newp->next = NULL;
			newp->data.coef = p1->data.coef*p2->data.coef;
			newp->data.exp = p1->data.exp *p2->data.exp;
			t->next = newp;
			t = t->next;
			p2 = p2->next;
		}
		Add(pd, pc, p);
		Copy(pc, pd);
		p1 = p1->next;
		p2 = pb->next;
		Destroy(p);
		Destroy(pd);
	}
}
void division(Link &pc, Link pa, Link pb)//将两个一元多项式相除函数  
{
	Link p1, p2, p, pd, newp, t;
	pc = new LNode;
	pc->next = NULL;
	p1 = pa->next;
	p2 = pb->next;
	while (p1 != NULL)
	{
		pd = new LNode;
		pd->next = NULL;
		p = new LNode;
		p->next = NULL;
		t = p;
		while (p2)
		{
			newp = new LNode;
			newp->next = NULL;
			newp->data.coef = p1->data.coef / p2->data.coef;
			newp->data.exp = p1->data.exp - p2->data.exp;
			t->next = newp;
			t = t->next;
			p2 = p2->next;
		}
		Add(pd, pc, p);
		Copy(pc, pd);
		p1 = p1->next;
		p2 = pb->next;
		Destroy(p);
		Destroy(pd);
	}
}

void Menu()//菜单函数  
{
	cout << "" << endl;
	cout << endl;
	cout << "\t\t\t一元多项式的加减乘除运算" << endl;
	cout << "\t\t\t\t\t\t\t\t   " << endl;
	cout << "\t\t  1 创建要运算的两个一元多项式\t\t   " << endl;
	cout << "\t\t  2 将两个一元多项式相加\t\t\t   " << endl;
	cout << "\t\t  3 将两个一元多项式相减\t\t\t   " << endl;
	cout << "\t\t  4 将两个一元多项式相乘\t\t\t   " << endl;
	cout << "\t\t  5 将两个一元多项式相除\t\t\t   " << endl;
	cout << "\t\t  0 退出         " << endl;
	cout << "\t\t\t\t\t\t\t\t   " << endl;
	cout << endl;
	cout << "\t\t  请选择:";
}


void main()
{
	int n;
	Link L, La = NULL, Lb = NULL;//La,Lb分别为创建的两个多项式  
	int choose;
	while (1)
	{
		Menu(); //调用菜单函数  
		cin >> choose;
		switch (choose)
		{
		case 1:
			cout << "请输入你要运算的第一个一元多项式的项数:" << endl;
			cin >> n;
			Create(La, n);
			cout << "请输入你要运算的第二个一元多项式的项数:" << endl;
			cin >> n;
			Create(Lb, n);
			break;
		case 2:
			if (La == NULL || Lb == NULL)
			{
				cout << "您的多项式创建有误,请重新选择……" << endl;
				break;
			}
			Add(L, La, Lb);
			cout << "" << endl;

			cout << "待相加的两个一元多项式为:" << endl;
			cout << "" << endl;
			cout << "A的多项式为:";
			Print(La);
			cout << "" << endl;
			cout << "B的多项式为:";
			Print(Lb);
			cout << "" << endl;
			cout << "相加后的结果为:";
			Print(L);
			cout << "" << endl;
			Destroy(L);
			break;
		case 3:
			Substract(L, La, Lb);
			cout << "相减的两个一元多项式为:" << endl;
			cout << "" << endl;
			cout << "A的多项式为:";
			Print(La);
			cout << "" << endl;
			cout << "B的多项式为:";
			Print(Lb);
			cout << "" << endl;
			cout << "相减后的结果为:";
			Print(L);
			cout << "" << endl;
			Destroy(L);
			break;
		case 4:
			if (La == NULL || Lb == NULL)
			{
				cout << "您的多项式创建有误,请重新选择……" << endl;
				break;
			}
			Multiply(L, La, Lb);
			cout << "相乘的两个一元多项式为:" << endl;
			cout << "" << endl;
			cout << "A的多项式为:";
			Print(La);
			cout << "" << endl;
			cout << "B的多项式为:";
			Print(Lb);
			cout << "" << endl;
			cout << "相乘后的结果为:";

			Print(L);
			Destroy(L);
			cout << "" << endl;
			break;
		case 5:
			if (La == NULL || Lb == NULL)
			{
				cout << "您的多项式创建有误,请重新选择……" << endl;
				break;
			}
			division(L, La, Lb);
			cout << "相除的两个一元多项式为:" << endl;
			cout << "" << endl;
			cout << "A的多项式为:";
			Print(La);
			cout << "" << endl;
			cout << "B的多项式为:";
			Print(Lb);
			cout << "" << endl;
			cout << "相除后的结果为:";

			Print(L);
			Destroy(L);
			cout << "" << endl;
			break;
		case 0:exit(1);
			Print(L);
			cout << "" << endl;
			break;
		}
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值