基于链表的多项式乘法

该博客展示了如何使用C语言实现多项式相加和相乘的算法。通过定义结构体表示多项式节点,利用链表存储多项式,并提供创建链表、显示链表、多项式相加和相乘的函数。程序首先读取两个多项式,然后输出它们的和与乘积,所有操作的结果都保存在指定的输出文件中。

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

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

/************************************************************************/

typedef struct polynode
{//定义一个结构体表示多项式的一项
	double c;//系数
	int e;//指数
	struct polynode *next;//要求结点按指数e升序连接
}PNode,*Polyn;

/************************************************************************/

void main()
{
	void Create_LinkList(Polyn h,int n);//建立链表的函数声名
	Polyn add(Polyn h1,Polyn h2);//两个多项式相加的函数声明
	Polyn mul(Polyn hp,Polyn hq);//两个多项式相乘的函数声明
	void Display_LinkList(Polyn h);//输出链表h数值域中的值的函数声明
	freopen("debug\\InData.txt","r",stdin); //输入重定向,输入数据将从InData.txt文件中读取
	freopen("debug\\OutData.txt","w",stdout); //输出重定向,输出数据将保存在OutData.txt文件中
	Polyn hp,hq;int np,nq;
	scanf("%d %d",&np,&nq);
	hp=(Polyn)malloc(sizeof(PNode));hq=(Polyn)malloc(sizeof(PNode));
	hp->next=NULL;hq->next=NULL;//创建两个头结点hp、hq
	Create_LinkList(hp,np);Create_LinkList(hq,nq);//调用函数建立两个链表,作为多项式P(x)、Q(x)
	printf("\n");
	printf("多项式P(x)=");
	Display_LinkList(hp);//输出多项式P(x)
	printf("\n");
	printf("多项式Q(x)=");
	Display_LinkList(hq);//输出多项式Q(x)
	printf("\n");
	printf("R(x)=P(x)*Q(x)=");
	Display_LinkList(mul(hp,hq));//输出两个多项式的乘积
	printf("\n");
	fclose(stdin);//关闭文件
	fclose(stdout);//关闭文件
}

/************************************************************************/

void Create_LinkList(Polyn h,int n)
{//尾插法创建不带头结点的单链表,使得结点按指数e升序连接
	int i;
	Polyn p,last=h;//指针last追踪链表最后一个结点
	for(i=n;i>0;i--)
	{
		p=(Polyn)malloc(sizeof(PNode));//生成一个新的结点
		scanf("%lf",&p->c);
		scanf("%d",&p->e);//装填数据
		last->next=p;
		last=p;
		last->next=NULL;//将新的结点插入到原开始结点之后,并且使last指针指向最后一个结点
	}
}

/************************************************************************/

Polyn add(Polyn h1,Polyn h2)
{//通过单向链表实现两个多项式的相加的子函数
	Polyn p1,p2,p3;//创建分别扫描三个链表的扫描指针
	p1=h1->next;p2=h2->next;//初始化扫描指针p1和p2
	Polyn h3;
	h3=(Polyn)malloc(sizeof(PNode));
	h3->next=NULL;//创建一个新的结点h3并将其作为两个多项式和链表的头结点
	p3=h3;//初始化扫描指针p3;
	Polyn p;//创建一个机动指针p
	while(p1&&p2)//循环条件为扫描指针p1和p2不为空
	{
		if(p1->e<p2->e){p=p1;p1=p1->next;}
		else if(p1->e>p2->e){p=p2;p2=p2->next;}//将p1、p2两项中指数较小的一项交给p
		else //当p1->e==p2->e(p1、p2两项指数相等)为真时
		{
			p1->c+=p2->c;
			if(p1->c==0)//同指数的两项的系数和为零时,删除两个结点
			{
				p=p1;p1=p1->next;free(p);
				p=p2;p2=p2->next;free(p);
				continue;
			}
			p=p2;p2=p2->next;free(p);//同指数的两项的系数和不为零时,系数相加并给p
			p=p1;p1=p1->next;
		}
		p3->next=p;p3=p;//将机动指针p交给p3,尾插法插入到和链表中
	}//while(p1&&p2)循环结束
	if(p1)p3->next=p1;
	else if(p2)p3->next=p2;
	else p3->next=NULL;//将两个多项式中剩下的插入到和链表的末尾
	h1->next=h2->next=NULL;//将源链表置空
	return h3;//返回和式链表的头结点
}

/************************************************************************/

Polyn mul(Polyn hp,Polyn hq)
{//通过单向链表实现两个多项式相乘的子函数
	Polyn hr,ht;
	hr=(Polyn)malloc(sizeof(PNode));ht=(Polyn)malloc(sizeof(PNode));
	hr->next=NULL;ht->next=NULL;//建立两个中间多项式R(x)=0、T(x)=0
	Polyn p,q,pt;//创建三个扫描指针p、q、pt分别扫描多项式P(x)、Q(x)、T(x)
	q=hq->next;//初始化扫描指针q
	while(q)//循环条件为q不为空(多项式Q(x)没有被扫描完)
	{//以下实现将Q(x)的第i项和P(x)相乘,并放入T(x)中
		pt=ht;p=hp->next;
		while(p)
		{
			Polyn t;t=(Polyn)malloc(sizeof(PNode));t->next=NULL;//创建一个新结点,用于存放第i项和P(x)的项的乘积
			pt->next=t;pt=pt->next;
			pt->c=p->c*q->c;pt->e=p->e+q->e;p=p->next;
		}//while(p)循环结束
		pt->next=NULL;q=q->next;//将q指向Q(x)中的下个项
		//以下实现将T(x)加到R(x)中去
		hr=add(hr,ht);
	}//while(q)循环结束
	free(ht);
	return hr;
}

/************************************************************************/

void Display_LinkList(Polyn h)
{//输出链表h数值域中的值
	Polyn p;p=h;
	printf("%.3lf*x^%d",p->next->c,p->next->c);p=p->next;
	while(p->next)
	{
		printf("+%.3lf*x^%d",p->next->c,p->next->e);
		p=p->next;
	}
	printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值