⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 实训课实验报告二:一元稀疏多项式的简单计算器(加法与减法).cpp

📁 改编的计算器系统,可以简单的运行加减乘除,以及方程
💻 CPP
字号:
#include "stdio.h"
#include "stdlib.h"
#include <iostream.h>

struct Node;
typedef struct Node *PNode;
struct Node
{
	int coef;                   //系数
	int power;                  //指数
	PNode link;                 //指针域
};
typedef struct Node *LinkList;

LinkList createNullList(void);  //建立空链表
int append(LinkList llist,int coef,int power);//向多项式链表中添加节点
LinkList add(LinkList a,LinkList b);//多项式a+b
LinkList minus(LinkList a,LinkList b);//多项式a-b
void printList(LinkList llist);//输出多项式
void freeList(LinkList a );//释放链表

void main()
{
	int m,n;
	int coef,power;
	int i;
	LinkList a,b,c,d;
	a=createNullList();
	b=createNullList();
	c=createNullList();
	cout<<"输入第一个多项式的项数";
	cin>>m;
	for(i=0;i<m;i++)
	{
		cout<<"第"<<i+1<<"项的系数和指数";
		cin>>coef>>power;
		append(a,coef,power);
	}
    cout<<"第一个多项式为:";
	printList(a);	
	cout<<endl;
	cout<<"输入第二个多项式的项数";
	cin>>n;
	for(i=0;i<n;i++)
	{
		cout<<"第"<<i+1<<"项的系数和指数";
		cin>>coef>>power;
		append(b,coef,power);
	}

    cout<<"第二个多项式为:";
	printList(b);
    cout<<endl;
    c=add(a,b);
	cout<<"a+b为:";
	printList(c);
	cout<<endl;
    d=minus(a,b);
	cout<<"a-b为:";
	printList(d);
	cout<<endl;
}

LinkList createNullList(void) 
//建立空链表
{
	LinkList llist;
	llist=(PNode)malloc(sizeof(struct Node));//新建一个结点
		if(llist!=NULL)
		{
			llist->link=NULL;
		}
		return llist;
}

int append(LinkList llist,int coef,int power)
//向多项式链表中添加节点
{
	PNode pnode;
	pnode=llist;
	while(pnode->link!=NULL)
	{
		pnode=pnode->link;
	}
	pnode->link=(PNode)malloc(sizeof(struct Node));//新建一个结点
	pnode=pnode->link;    
	if(pnode!=NULL)              //把系数和指数输入到新建的结点中
	{
		pnode->coef=coef;
		pnode->power=power;
		pnode->link=NULL;
	}
	return pnode==NULL;
}


LinkList add(LinkList a,LinkList b)
//多项式a+b
{
	LinkList c;
	PNode cur_a,cur_b,cur_c=NULL;
	c=createNullList();
	if(c==NULL)
		return NULL;
	cur_a=a->link;
	cur_b=b->link;
	while(cur_a!=NULL&&cur_b!=NULL)
	{
		if(cur_a->power>cur_b->power)//当a的指数大于b的指数
		{
			if(append(c,cur_a->coef,cur_a->power))//把a的系数和指数赋值给c的新建结点中
			{
				freeList(c);
				return NULL;
			}
			cur_a=cur_a->link;    //a的指针向后移动一位
		}
		else if(cur_a->power<cur_b->power)//当a的指数小于b的指数
		{
			if(append(c,cur_b->coef,cur_b->power))//把b的系数和指数赋值给c的新建结点中
			{
				freeList(c);
				return NULL;
			}
			cur_b=cur_b->link;   //把b的指针向后移动一位
		}
		else    //当a的指数等于b的指数
		{
			if(append(c,cur_a->coef+cur_b->coef,cur_a->power))//把a和b的系数相加赋值给c的新建的结点
			{
				freeList(c);
				return NULL;
			}
			cur_a=cur_a->link;  //a的指针向后移动一位
			cur_b=cur_b->link;  //把b的指针向后移动一位
		}
	}
	if(cur_a!=NULL)      //当只有a时,把a的系数和指数赋值给c的新建结点中
	{
		while(cur_a!=NULL)
		{
			if(append(c,cur_a->coef,cur_a->power))
			{
				freeList(c);
				return NULL;
			}
			cur_a=cur_a->link;
		}
	}
	if(cur_b!=NULL)     //当只有b时,把a的系数和指数赋值给c的新建结点中
	{
		while(cur_b!=NULL)
		{
			if(append(c,cur_b->coef,cur_b->power))
			{
				freeList(c);
				return NULL;
			}
			cur_b=cur_b->link;
		}
	}
	return c;
}

LinkList minus(LinkList a,LinkList b)
//多项式a-b
{
	LinkList d;
	PNode cur_a,cur_b,cur_d=NULL;
	d=createNullList();
	if(d==NULL)
		return NULL;
	cur_a=a->link;
	cur_b=b->link;
	while(cur_a!=NULL&&cur_b!=NULL)
	{
		if(cur_a->power>cur_b->power)
		{
			if(append(d,cur_a->coef,cur_a->power))
			{
				freeList(d);
				return NULL;
			}
			cur_a=cur_a->link;
		}
		else if(cur_a->power<cur_b->power)
		{
			if(append(d,-cur_b->coef,cur_b->power))  
			{
				freeList(d);
				return NULL;
			}
			cur_b=cur_b->link;
		}
		else
		{
			if(append(d,cur_a->coef-cur_b->coef,cur_a->power))   //把a和b的系数相加赋值给c的新建的结点
			{
				freeList(d);
				return NULL;
			}
			cur_a=cur_a->link;
			cur_b=cur_b->link;
		}
	}
	if(cur_a!=NULL)
	{
		while(cur_a!=NULL)
		{
			if(append(d,cur_a->coef,cur_a->power))
			{
				freeList(d);
				return NULL;
			}
			cur_a=cur_a->link;
		}
	}
	if(cur_b!=NULL)
	{
		while(cur_b!=NULL)
		{
			if(append(d,-cur_b->coef,cur_b->power))
			{
				freeList(d);
				return NULL;
			}
			cur_b=cur_b->link;
		}
	}
	return d;
}

void printList(LinkList llist)
//输出多项式
{
	PNode l;
	l=llist->link; 
	while(l->coef==0)
	{
		if(l->link==NULL)
		{
			cout<<0;
			break;
		}
		l=l->link;
	}
	while(l!=NULL)
	{	        
          if(l->coef!=0)    //当系数等于0的时候,这项不输出
			if(l->power!=0)
			{
		    cout<<l->coef<<"x"<<l->power;
		    if(l->link!=NULL && l->link->coef>=0)
			cout<<"+";
			}
			else    //当指数等于0的时候
			{
				cout<<l->coef;  //只输出系数
				if(l->link!=NULL && l->link->coef>=0)
			cout<<"+";
			}
		l=l->link;
	}
}

void freeList(LinkList a )  //释放链表
{
	PNode l=a;
	PNode m=l->link;
	while(l!=NULL)
	{
		free(l);
		l=m;
		m=m->link;
	}
}

/*思考问题
1、用户的输入如果不严格按照指数降序排列,append函数内应完成指数降序排列的功能
2、考虑是否可以将add和minus函数合并为一个函数
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -