一元多项式的实现包含链表的定义,读入,插入,输出等基本操作,是学习链表基本操作的好实例。这里对一元多项式的加法、乘法分开分析和实现,其中多项式是按指数递减存储的。两个代码都经过调试是正确的,由于使用的是C++编译的,输入函数使用scanf()函数有安全问题,所以使用的是scanf_s()函数,但scanf_s()函数在C中调试会编译错误,需要改回scanf()函数。
- 一元多项式的加法
对一个多项式通过链表实现加法,需要建立链表结构体,读入链表,链表插入(指数比较系数相加),结果输出等几个步骤。这里输出时若多项式相加为零多项式,输出为“0 0”。
#include <stdlib.h>
#include <stdio.h>
//定义结构体
struct PolyNode
{
int coef; //系数
int expon; //指数
struct PolyNode *link; //指向下一个节点指针
};
typedef struct PolyNode *Polynomial;
//多项式读入函数
Polynomial PolyRead();
//比较函数
int Compare(int , int );
//添加结点函数
void Attach(int , int , Polynomial* );
//多项式求和函数
Polynomial PolyAdd(Polynomial , Polynomial );
//链表输出
void PrintPoly(Polynomial P);
int main()
{
Polynomial P1, P2, R_Add, R_Mult;
P1 = PolyRead();
P2 = PolyRead();
R_Add = PolyAdd(P1, P2);
PrintPoly( R_Add);
system("pause");
return 0;
}
//多项式读入函数,直接读入
Polynomial PolyRead()
{
int N;
scanf_s("%d", &N);
Polynomial Head , Rear, Tmp; //定义的应该是指针,需要分配空间才能使用
Rear = (Polynomial) malloc(Len); //分配空间
Rear->link = NULL; //表头空结点
Head = Rear;
for(int i=0; i< N; i++) //创建链表
{
Tmp = (Polynomial) malloc( Len); //申请新结点
Tmp->link = NULL;
scanf_s("%d", &Tmp->coef );
scanf_s("%d", &Tmp->expon );
Rear->link = Tmp; //新结点插入尾部
Rear = Tmp;
}
Tmp = Head;
Head = Head->link;
free(Tmp); //删除临时空的头结点
return Head;
}
//比较函数
int Compare(int e1, int e2)
{
//比较两项指数e1和e2,根据大、小、等三种情况分别返回1,-1,0
if(e1 > e2) return 1;
else if(e1 < e2) return -1;
else return 0;
}
//添加结点函数
void Attach(int coef, int expon, Polynomial *PtrRear)
{
//本函数需要改变当前结果表达式的尾指针的值
//函数传递进来的是尾项指针的地址
Polynomial P;
//申请新结点并赋值
P=(Polynomial) malloc(sizeof(struct PolyNode));
P->coef = coef;
P->expon = expon;
P->link = NULL;
//将P指向新结点插入到当前结果表达式尾项后面
(*PtrRear) ->link = P;
*PtrRear = P; //修改PtrRear值
}
//多项式求和函数
Polynomial PolyAdd(Polynomial P1, Polynomial P2)
{
Polynomial front, rear, temp;
int sum;
//为方便表头插入,先产生一个临时空结点作为结果多项式链表头
rear = (Polynomial) malloc(sizeof(struct PolyNode));
front = rear; //由front记录结果多项式的表头
while(P1 && P2)
{
switch( Compare(P1->expon, P2->expon))
{
case 1:
Attach(P1->coef, P1->expon, &rear);
P1 = P1->link;
break;
case -1:
Attach(P2->coef, P2->expon, &rear);
P2 = P2->link;
break;
case 0:
sum = P1->coef + P2->coef;
if(sum) Attach(sum, P1->expon, &rear);
P1 = P1->link;
P2 = P2->link;
break;
}
}
//将为处理完的另一项多项式的所有结点依次复制到结果多项式中
for(; P1; P1=P1->link) Attach(P1->coef, P1->expon, &rear);
for(; P2; P2=P2->link) Attach(P2->coef, P2->expon, &rear);
rear->link = NULL;
temp = front;
front = front->link; //front指向结果多项式第一非零项
free(temp); //删除临时空的头结点
return front;
}
//链表输出
void PrintPoly(Polynomial P)
{
//输出多项式
int flag = 0;
if(P ==NULL) printf("0 0");
while(P)
{
if(!flag) flag = 1; //头结点为空不输出
else
printf(" ");
printf("%d %d", P->coef, P->expon);
P = P->link ;
}
printf("\n");
}
2.一元多项式的乘法
#include <stdlib.h>
#include <stdio.h>
//定义结构体
struct PolyNode
{
int coef; //系数
int expon; //指数
struct PolyNode *link; //指向下一个节点指针
};
typedef struct PolyNode *Polynomial;
//多项式读入函数
Polynomial PolyRead();
//添加结点函数
void Attach(int , int , Polynomial* );
//多项式求乘积函数
Polynomial PolyMultiply(Polynomial , Polynomial);
//链表输出
void PrintPoly(Polynomial P);
int main()
{
Polynomial P1, P2, R_Add, R_Mult;
P1 = PolyRead();
P2 = PolyRead();
R_Mult = PolyMultiply(P1, P2);
PrintPoly(R_Mult);
system("pause"); //VS中调试结果输出暂停
return 0;
}
//多项式读入函数
Polynomial PolyRead()
{
Polynomial P,Rear,t;
int c, e, N;
scanf_s("%d", &N); //读入结点个数
P =(Polynomial) malloc(sizeof(struct PolyNode));
P->link = NULL;
Rear = P; //指向同一空头结点
while(N--)
{
scanf_s("%d %d", &c, &e);
Attach(c, e, &Rear);
}
t= P; P= P->link; free(t); //删除临时空的头结点
return P;
}
//添加结点函数
void Attach(int coef, int expon, Polynomial *PtrRear)
{
//本函数需要改变当前结果表达式的尾指针的值
//函数传递进来的是尾项指针的地址
Polynomial P;
//申请新结点并赋值
P=(Polynomial) malloc(sizeof(struct PolyNode));
P->coef = coef;
P->expon = expon;
P->link = NULL;
//将P指向新结点插入到当前结果表达式尾项后面
(*PtrRear) ->link = P;
*PtrRear = P; //修改PtrRear值
}
//多项式求乘积函数
Polynomial PolyMultiply(Polynomial P1, Polynomial P2)
{
Polynomial P, Rear, t1, t2, t;
int c, e;
if(!P1 || !P2) return NULL;
t1= P1; t2 = P2;
P=(Polynomial) malloc(sizeof(struct PolyNode)); //P为输出的乘积指针
P->link = NULL;
Rear = P;
while(t2) //先将t1第一项和t2相乘并加入Rear
{
//t1,t2系数相乘,指数相加
Attach(t1->coef * t2->coef, t1->expon + t2->expon, &Rear);
t2= t2->link;
}
t1= t1->link;
while(t1)
{
t2 = P2; Rear = P; //指针从头循环
while(t2)
{
c = t1->coef * t2->coef; //t1,t2系数相乘,指数相加
e = t1->expon + t2->expon;
while(Rear->link && Rear->link->expon >e)
Rear = Rear->link;
if(Rear->link && Rear->link->expon == e)
{
Rear->link->coef += c;
if(Rear->link->coef == 0)
{
t = Rear->link;
Rear->link = t->link;
free(t); //删除指数为0结点
}
}
else
{
t =(Polynomial) malloc(sizeof(struct PolyNode));
t->coef =c;
t->expon = e;
t->link = Rear->link;
Rear->link = t; //插入t
Rear = Rear->link; //t2还在循环,需要继续往后移动
}
t2= t2->link;
}
t1= t1->link;
}
t = P;
P= P->link;
free(t);
return P;
}
//链表输出
void PrintPoly(Polynomial P)
{
//输出多项式
int flag = 0;
if(P ==NULL) printf("0 0");
while(P)
{
if(!flag) flag = 1; //头结点为空不输出
else
printf(" ");
printf("%d %d", P->coef, P->expon);
P = P->link ;
}
printf("\n");
}