c语言版数据结构(奇迹冬瓜)-链表实战(4)双链表解一元多项式相乘

本文介绍了一种使用双链表实现一元多项式相乘的方法。通过初始化多项式A、B和C,并给A和B赋值,接着进行逐项相乘并累加到C中,最终输出结果。文章详细展示了各步骤的C语言代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//c语言版数据结构(奇迹冬瓜)-链表实战(4)双链表解一元多项式相乘

/*
主要函数思想:
初始化一元多项式A
初始化一元多项式B
初始化一元多项式C
给一元多项式A赋入数据
给一元多项式B赋入数据(指数升序)
把AB各项累乘放入C中
用双指针的模式消除合并累加最后得到结果
输出
*/

//---------头文件----------
#include<stdio.h>
#include<stdlib.h>

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

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

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

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

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

Bool InitPolynomial(Polynomial f);  
Bool InputData(Polynomial f);
void Multiply(Polynomial f1,Polynomial f2,Polynomial f3);
void Add(Polynomial f3);
void OutputData(Polynomial f3);

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

void main()
{
	Poly A,B,C,*f1=&A,*f2=&B,*f3=&C;
	InitPolynomial(f1);InitPolynomial(f2);InitPolynomial(f3);  
	InputData(f1);InputData(f2);  
	Multiply(f1,f2,f3);
	Add(f3);
	OutputData(f3);
}

//---------其余函数---------

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

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

void Multiply(Polynomial f1,Polynomial f2,Polynomial f3)
{
	Polynomial StartNode=f3,TempNode=f3,NewNode,Point1=f1->next,Point2;
	while(Point1)
	{
		Point2=f2->next;
		for(;Point2;Point2=Point2->next)
		{
			if(!(NewNode=(Polynomial)malloc(sizeof(Poly))))
			{
				exit(OVERFLOW);
			}
			NewNode->coef=Point1->coef*Point2->coef;
			NewNode->expn=Point1->expn+Point2->expn;
			TempNode->next=NewNode;
			NewNode->prior=TempNode;
			NewNode->next=NULL;
			TempNode=NewNode;
		}
		Point1=Point1->next;
	}
	f3=StartNode;
}

void Add(Polynomial f3)
{
	Polynomial Point1=f3->next,Point2,StartNode=f3,Temp;
	while(Point1)
	{
		for(Point2=Point1->next;Point2;)
		{
			if(Point1->expn==Point2->expn)
			{
				Point1->coef+=Point2->coef;
				Temp=Point2;
				Point2=Point2->next;
				Temp->prior->next=Temp->next;
				Temp->next->prior=Temp->prior;
				//DeleteNode(f3,i);
			}
			else
			{
				Point2=Point2->next;
			}
		}
		if(0==Point1->coef)
		{
			Temp=Point1;
			Point1=Point1->next;
			Temp->prior->next=Temp->next;
			Temp->next->prior=Temp->prior;
		}
		else
		{
			Point1=Point1->next;
		}
	}
	f3=StartNode;
}

void OutputData(Polynomial f3)
{
	f3=f3->next;  
	printf("f(x)=");  
	while(f3)  
	{  
		if(f3->expn)  
		{  
			printf("%.0fx^%d",f3->coef,f3->expn);  //这里数据为了好看为.0格式,其实不应该要的,因为是浮点型数据,而这里的浮点型恰好不为小数。
		}  
		else  
		{  
			printf("%.0f",f3->coef);  
		}  

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

}


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值