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

📄 polynomial calculator.cpp

📁 数据结构实验
💻 CPP
字号:
#include <stdio.h>
#include <malloc.h>
#include <math.h>


typedef struct{
	double	coef;
	int		expn;
}ElemType;

typedef struct LNode{
	ElemType	data;
	struct		LNode *next;
}LNode, *LinkList;

void CreatPolyn(LinkList &P , int n);
void print(LinkList P);
int Compare(LinkList a, LinkList b);
void MultiPolyn(LinkList &Pa, LinkList &Pb);
void AddPolyn(LinkList &Pa, LinkList &Pb);
void MinuPolyn(LinkList &Pa, LinkList &Pb);

void main()
{
	int i,j,k;
	LinkList Pa,Pb;
p:	printf("***************************\n");
	printf("*   一元稀疏多项式计算器  *\n");
	printf("*                         *\n");
	printf("*       1:多项式相加      *\n");
	printf("*       2:多项式相减      *\n");
	printf("*       3.多项式相乘      *\n");
	printf("*          4:退出         *\n");
	printf("***************************\n\n");
	printf("请选择相应的操作:");
	scanf("%d",&k);
	if(k<4)
	{
		printf("请输入第一个多项式的项数 n1:");
		scanf("%d",&i);
		printf("输入其各项系数及指数:\n");
		CreatPolyn(Pa, i);
		printf("\n");
		print(Pa);
		printf("\n-----------------------------------");
		printf("\n请输入第二个多项式的项数 n2:");
		scanf("%d",&j);
		printf("输入其各项系数及指数:\n");
		CreatPolyn(Pb, j);
		printf("\n");
		print(Pb);
		printf("\n-----------------------------------");
	}
	switch(k)
	{
	case 1:
		AddPolyn(Pa, Pb);
		printf("\n计算结果:\n");
		print(Pa);
		printf("\n-----------------------------------\n");
		break;
	case 2:
		MinuPolyn(Pa, Pb);
		printf("\n计算结果:\n");
		print(Pa);
		printf("\n---------------------------------\n");
		break;
	case 3:
		MultiPolyn(Pa, Pb);
		printf("\n计算结果:\n");
		print(Pa);
		printf("\n---------------------------------\n");
		break;
	default:
		break;
	}
	if(k!=4)goto p;
}


void CreatPolyn(LinkList &P , int n)
{
	P = (LinkList)malloc(sizeof(LNode));
	P->next = NULL;
	LinkList h,q,p2;
	h=P;
	p2=h->next;
	P->data.coef=0.0;
	P->data.expn=n;
	int i;
	{
		q=(LinkList)malloc(sizeof(LNode));
		scanf("%lf%d",&q->data.coef,&q->data.expn);
		h->next = q; q->next = NULL;
	}
	for(i=1;i<=n-1;i++)
	{
		q=(LinkList)malloc(sizeof(LNode));
		scanf("%lf%d",&q->data.coef,&q->data.expn);
		if(q->data.coef)
		{
			h = P;
			p2 = h->next;
			while(p2)
			{
				if(q->data.expn == p2->data.expn)
				{
					p2->data.coef=p2->data.coef + q->data.coef;
					free(q);
					P->data.expn--;
					break;
				}
				else
					if(q->data.expn > p2->data.expn)
					{
						h->next = q;
						q->next = p2;
						h=q;break;
					} 
					else
						{h = h->next; p2 = h->next;}
			}
			if(p2==NULL)
			{h->next= q; 
			q->next=NULL;
			}
		}
	}
}



int Compare(LinkList a, LinkList b)
{
	if (a->data.expn < b->data.expn) return -1;
	if (a->data.expn > b->data.expn) return 1;
	return 0;
}


void AddPolyn(LinkList &Pa, LinkList &Pb)
{
	double sum;
	LinkList qa, qb, ha, hb, p;

	ha = Pa; hb = Pb;
	qa = ha->next; qb = hb->next;

	while(qa && qb)
	{
		switch(Compare(qa, qb))
		{
		case -1:
			hb->next = qb->next;
			p = ha->next;
			ha->next = qb;
			qb->next = p;
			qb = hb->next;
			qa = ha->next;
			break;

		case 0:
			sum = qa->data.coef + qb->data.coef;
			if(sum)
			{
				qa->data.coef = sum;
				ha = qa;
				Pb->data.expn--;
			}
			else
			{
				ha->next = qa->next;
				free(qa);
				Pa->data.expn--;
				Pb->data.expn--;
			}
			hb->next = qb->next;
			free(qb);
			
			qa = ha->next;
			qb = hb->next;
			
			break;

		case 1:
			ha = qa;
			qa = qa->next;
			break;
		}
	}
	if(qb)	ha->next = qb;
	Pa->data.expn = Pa->data.expn + Pb->data.expn;
	free(hb);
}


void MinuPolyn(LinkList &Pa, LinkList &Pb)
{
	LinkList p = Pb;
	while(p)
	{
		p->data.coef *= -1;
		p = p->next;
	}
	AddPolyn(Pa,Pb);
}


void print(LinkList P)
{
	LinkList current;
	current = P->next;
	if(!current)
	{
		printf("0");
	}
	else
		if(!current->data.coef)
		{
			printf("0");
		}
	else
	{
		if(current->data.expn)
		printf("%.1f * x^%d", current->data.coef, current->data.expn);
		else printf("%.1f", current->data.coef);
		while(current->next)
		{
			current = current -> next;
			if(current->data.coef>0)
			{if(current->data.expn)
			printf(" + %.1f * x^%d", current->data.coef, current->data.expn);
			else printf(" + %.1f", current->data.coef);
			}
			else
				if(!current->data.coef)continue;
			else
			{if(current->data.expn)
			printf(" - %.1f * x^%d", fabs(current->data.coef), current->data.expn);
			else printf(" - %.1f", current->data.coef);
			}
		}
	}
}


void MultiPolyn(LinkList &Pa, LinkList &Pb)
{
	LinkList pa = Pa,pb=Pb, p, q, r, s, t;

	r = p = (LinkList)malloc(sizeof(LNode));
	while(pa)
	{
		p->data.coef = pa->data.coef;
		p->data.expn = pa->data.expn;
		q = p;
		p = (LinkList)malloc(sizeof(LNode));
		q->next = p;
		pa = pa->next;
	}
	q->next = NULL;
	free(p);

	pa = Pa;
	t = s = (LinkList)malloc(sizeof(LNode));
	while(pa)
	{
		q = s;
		s = (LinkList)malloc(sizeof(LNode));
		q->next = s;
		pa = pa->next;
	}
	q->next = NULL;
	free(s);

	pa = Pa;
	while(pa)
	{
		pa->data.coef *= pb->data.coef;
		pa->data.expn += pb->data.expn;
		pa = pa->next;
	}

	pb = pb->next;
	while(pb)
	{
		p = r;
		s = t;
		while(p)
		{
			s->data.coef = p->data.coef * pb->data.coef;
			s->data.expn = p->data.expn + pb->data.expn;
			p = p->next;
			s = s->next;
		}
		AddPolyn(Pa,t);
		pb = pb->next;

		pa = r;
		t = s =(LinkList)malloc(sizeof(LNode));
		while(pa)
		{
			q = s;
			s =  (LinkList)malloc(sizeof(LNode));
			q->next = s;
			pa = pa->next;
		}
		q->next = NULL;
		free(s);
	}
}

⌨️ 快捷键说明

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