1. 程式人生 > >一元稀疏多項式計算 (資料結構實驗)

一元稀疏多項式計算 (資料結構實驗)

#include <bits/stdc++.h>
using namespace std;
struct node{
	float coef;//係數
	int exp;//指數
	node * next; 
};

node * creat(node * l)
{
	float coef; int exp;
	l = new node;
	node * p,* q;
	
	scanf("%f %d",&coef,&exp);
	p=l;
	while(coef!=0||exp!=0)
	{
	 p->coef = coef;
	 p->exp = exp;
	 p->next = new node;
	 q = p;
	 p=p->next;
	scanf("%f %d",&coef,&exp);	
	} 
	q->next=NULL;
	return l;
}
void Print(node * l)
{
	node * q = l;
	while(q!=NULL)
	{
		if(q->coef>0&&l!=q&&l!=q)
		{
			cout<<"+";
		}
		cout<<q->coef<<"x^"<<q->exp;
		q=q->next;
	}
	cout<<"\n";
}
void sortList(node *l)
{
	node * p,*q;
	for(p=l;p!=NULL;p=p->next)
	{
		q=l;
		for(q=l;q->next!=NULL;q=q->next)
		if(p->exp<q->exp)
		{
			int tmpe; float tmpf;
			tmpe = p->exp;
			p->exp = q ->exp;
			q->exp =tmpe;
			tmpf = p->coef;
			p->coef = q ->coef;
			q->coef =tmpf;			 
		}
	}
}
node * merge(node *a,node *b,node *c,float flag)
{
	node *p,*q,*l,*lq;
	p=a; q=b; //coef係數 
	c=new node;
	l=c;
	while(p!=NULL&&q!=NULL)
	{
		if(p->exp < q->exp)
		{
		  l->coef = p->coef;
		  l->exp =p->exp;
		  l->next = new node;
		  lq = l; l = l->next; 
		  
		  l->coef = q->coef;
		  l->exp =q->exp;
		  l->next = new node;
		  lq = l; l = l->next; 
		  
		}else if(p->exp > q->exp)
		{
		  l->coef = q->coef;
		  l->exp =q->exp;
		  l->next = new node;
		  lq = l; l = l->next; 
			
		  l->coef = p->coef;
		  l->exp =p->exp;
		  l->next = new node;
		  lq = l; l = l->next;	
			
		}else 
		{
			l->coef = p->coef+(flag)*q->coef;
			l->exp = p->exp;
			lq=l; l->next = new node;
			l=l->next;
		}
		if(p!=NULL)
		p=p->next;
		if(q!=NULL)
		q=q->next;
	}
	l=new node;
	while(p!=NULL)
	{
		  l->coef = p->coef;
		  l->exp =p->exp;
		  l->next = new node;
		  lq = l; l = l->next; 
		  p=p->next;
	}
	
	while(q!=NULL)
	{
		  l->coef = q->coef;
		  l->exp =q->exp;
		  l->next = new node;
		  lq = l; l = l->next; 
		  q=q->next;
	}
	lq->next = NULL;
	return c;
}
int main()
{
	node *a,*b,*c;
	cout<<"please input in accordance with the format:  (***) \n";
	cout<<"the first formula\n";
	a = creat(a);
	cout<<"the second formula\n";
	b = creat(b);
	sortList(a);
	sortList(b);
	cout<<"the first formula: "; Print(a);
	cout<<"the second formula: ";Print(b);
	
	float plus=1,mins=-1;
	c = merge(a,b,c,plus);
	cout<<"plus: ";Print(c);
	c = merge(a,b,c,mins);
	cout<<"mins: ";Print(c);
} 

/*
3 1 -2 2 6 3 0 0

1 1 1 2 1 3 0 0
*/