c语言版数据结构(奇迹冬瓜)-链表实战(3)解升序排列的一元多项式相加

//c语言版数据结构(奇迹冬瓜)-链表实战(3)解升序排列的一元多项式相加

/*
主要函数思想:
初始化一元多项式A
初始化一元多项式B
初始化一元多项式C
给一元多项式A赋入数据
给一元多项式B赋入数据(指数升序)
当A的结点或者B的结点项的下一项不为空
{
    比较AB的指数
	{
	   定位当前结点A的指数,定位当前结点B的指数.
	   如果A的结点指数<B的结点指数(C的下一个结点为当前A的结点,A移动结点)
	   如果A的结点指数=B的结点指数(如果系数A+B=0,A,B结点都移动)
	   如果A的结点指数>B的结点指数(C的下一个结点为当前B的结点,B移动结点)
	}
}
当A的结点不为空
{
  c链接A接下来的结点
}
当B的结点不为空
{
  c链接B接下来的结点
}
输出
*/

//---------头文件----------

#include<stdio.h>
#include<stdlib.h>

//---------宏定义----------

#define TRUE 1
#define ERROR 0
#define OVERFLOW -2

//-----结构体和替换名------

typedef struct Node
{
	float coef;
	int expn;
	struct Node *next;
}Poly,*Polynomial;

//------函数-------

int InitPolynomial(Polynomial f);
int InputData(Polynomial f);
int Compare(int c1,int c2);
int JudgeCoefZero(float a1,float a2);
void OutPut(Polynomial f);

//-----主函数-----

void main()
{
	Poly A,B,C,*f1=&A,*f2=&B,*f3=&C;
	int d;
	InitPolynomial(f1);InitPolynomial(f2);InitPolynomial(f3);
	InputData(f1);InputData(f2);
	f1=f1->next;
	f2=f2->next;
	while(f1&&f2)
	{
		d=Compare(f1->expn,f2->expn);
		switch(d)
		{
		   case -1:f3->next=f1;f1=f1->next;f3=f3->next;break;
		   case 0:if(!JudgeCoefZero(f1->coef,f2->coef))
				  {
					  f1->coef+=f2->coef;
					  f3->next=f1;
					  f3=f3->next;
				  }
				  f1=f1->next;
				  f2=f2->next;
				  break;
		   case 1:f3->next=f2;f2=f2->next;f3=f3->next;break;
		}
	}
	if(f1)
	{
		f3->next=f1;
	}
	if(f2)
	{
		f3->next=f2;
	}
	OutPut(&C);
}

int InitPolynomial(Polynomial f)
{
	if(!(f=(Polynomial)malloc(sizeof(Poly))))
	{
		exit(OVERFLOW);
	}
	f->next=NULL;
	return TRUE;
}

int InputData(Polynomial f)
{
	Polynomial StartNode=f,Tempf=f,NewNode;
	int n;
	printf("输入多项式的项数:");
	do
	{
		scanf("%d",&n);
		if(n<0)
		{
			printf("输入错误!重新输入.\n");
		}
	}while(n<0);
	printf("按升序输入一元多项式的系数和指数:\n");
	for(;n>0;n--)
	{
		if(!(NewNode=(Polynomial)malloc(sizeof(Poly))))
	    {
			exit(OVERFLOW);
		}
		scanf("%f%d",&NewNode->coef,&NewNode->expn);
		Tempf->next=NewNode;
		NewNode->next=NULL;
		Tempf=NewNode;
	}
	f=StartNode;
	return TRUE;
}

int Compare(int c1,int c2)
{
	if(c1>c2)
	{
		return 1;
	}
	else if(c1==c2)
	{
		return 0;
	}
	else
	{
		return -1;
	}
}

int JudgeCoefZero(float a1,float a2)
{
	return 0==a1+a2?1:0;
}

void OutPut(Polynomial f)
{
	f=f->next;
	printf("f(x)=");
	while(f)
	{
		if(f->expn)
		{
			printf("%fx^%d",f->coef,f->expn);
		}
		else
		{
			printf("%f",f->coef);
		}

		f=f->next;
		if(f&&f->coef>0)
		{
			printf("+");
		}
	}
	getchar();
	getchar();
}


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值