数据结构之链表创建一元多项式,求一元多项式之和

前言

数据结构之链表创建一元多项式,求一元多项式之和_结点

对于一元多项式,我们完全可以利用线性表P(a0,a1,a2,…,an)表示,这样的线性表在求两个多项式相加等操作时确实简单,但是多于如下的多项式:

数据结构之链表创建一元多项式,求一元多项式之和_一元多项式_02

利用上述线性表将存储为S(1,0,0,0,0,…,3,…,2);这样的结构显然对内存造成浪费

为了解决以上问题,可以将上面的线性表改善为P((a1,e1),(a2,e2),…,(am,em))只存储系数不为0的项,下面是该线性表的链式存储结构的代码实现。

#include "stdafx.h"
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"

#define LEN sizeof(node);

typedef struct polynode
{
int coef;//系数
int exp;//指数
struct polynode *next;
}node,*ListPolynode;

/*倒序创建一元多项式*/
void createPoly(ListPolynode L,int n)
{
ListPolynode p;
for (int i=n;i>0;i--)
{
p=(ListPolynode)malloc(sizeof(node));
printf("请输入第%d项系数\n",i);
scanf_s("%d",&p->coef);
printf("请输入第%d项指数\n",i);
scanf_s("%d",&p->exp);
p->next=L->next;
L->next=p;
}
}
/*正序创建一元多项式*/
ListPolynode createPoly1(ListPolynode L,int n)
{
ListPolynode p;
ListPolynode head=L;
for (int i=0;i<n;i++)
{
p=(ListPolynode)malloc(sizeof(node));
printf("请输入第%d项系数\n",i+1);
scanf_s("%d",&p->coef);
printf("请输入第%d项指数\n",i+1);
scanf_s("%d",&p->exp);
L->next=p;
p->next=NULL;
L=L->next;
}
return head;
}
/*打印一元多项式*/
void printfPoly(ListPolynode L)
{
ListPolynode p=L->next;
while(p)
{
printf("%d*x^%d ",p->coef,p->exp);
p=p->next;
}
printf("\n");
}

/*多项式相加*/
void addPoly(ListPolynode La,ListPolynode Lb)
{
ListPolynode currenLa=La->next;//指向La的当前结点
ListPolynode currenLb=Lb->next;//指向Lb的当前结点
ListPolynode temp;//待释放空间的临时结点
ListPolynode pre=La;/*位置指针,指向和多项式La,利用pre修改La*/
int sum;//相同指数结点系数之和
while (currenLa!=NULL&&currenLb!=NULL)
{
if (currenLa->exp<currenLb->exp)//La的当前结点指小于于Lb的当前结点指数
{
//Lb的当前位置不变,La当前位置后移
pre->next=currenLa;
pre=pre->next;
currenLa=currenLa->next;
}
else if (currenLa->exp==currenLb->exp)//La的当前结点指数等于Lb的当前结点指数
{
sum=currenLa->coef+currenLb->coef;
if (sum!=0)
{
//将La当前结点的系数改为sum,并链接到pre;将La的当前结点后移,之后过河拆桥将La的当前结点释放
currenLa->coef=sum;
pre->next=currenLa;
pre=pre->next;
currenLa=currenLa->next;
temp=currenLb;
currenLb=currenLb->next;
free(temp);
}
else
{
temp=currenLa->next;
free(currenLa);//过河拆桥干掉La当前结点
currenLa=temp;

temp=currenLb->next;
free(currenLb);//策略雷同,过河拆桥
currenLb=temp;
}
}
else//La的当前结点指数大于Lb的当前结点指数
{
//Lb当前位置添加到La当前位置之前,同时Lb向后移动一位,La向后移动一位
pre->next=currenLb;
pre=pre->next;
currenLb=currenLb->next;
}
}

if (currenLa!=NULL)//La未结束,将其全部链接到pre
{
pre->next=currenLa;
}
else//若Lb未结束,将其全部链接到pre
{
pre->next=currenLb;
}
}


int _tmain(int argc, _TCHAR* argv[])
{
ListPolynode La=(ListPolynode)malloc(sizeof(node));
La->next=NULL;
printf("请输入创建一元多项式的项数\n");
int n;
scanf_s("%d",&n);
createPoly1(La,n);
printfPoly(La);

ListPolynode Lb=(ListPolynode)malloc(sizeof(node));
Lb->next=NULL;
printf("请输入创建一元多项式的项数\n");
scanf_s("%d",&n);
createPoly(Lb,n);
printfPoly(Lb);

addPoly(La,Lb);
printfPoly(La);



system("pause");
return 0;
}

数据结构之链表创建一元多项式,求一元多项式之和_结点_03