#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");
}
基于链表的多项式乘法
最新推荐文章于 2023-03-31 11:03:47 发布