版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mozha_666/article/details/79658496
捕捉一元多项式的描述要点
一元多项式有多个数据项,每个数据项的关键点是变量的指数,变量的系数
- 顺序存储,一维数组进行存储
对应关系:数组下标0-n-1,和变量系数对应,数组的数据单元可以存储变量的系数
优点:
数组适合随机存取,利用它存储多项式,做加减法运算很方便
缺点:
若非零项少,浪费存储空间
- 顺序存储:利用结构数组只存储非零项数据
1、结构数组,就是可以存储多个结构体的数组
2、对于一元多项式,结构体,只要包含两个属性,一个是系数,一个是指数
3、为了方便查找,可以按指数的升序或降序序列进行存储
typedef struct {
int expon;//指数
int coef;//系数
}Polynomial;
Polynomial data[MAXSIZE];//结构数组
- 链式存储,非零项
1、链表的每个结点应包含,系数+指数+next指针
typedef struct Polynomial{
int expon;//指数
int coef;//系数
struct Polynomial *next;
}Polynomial;
来张图更直观一些
接下来,来份代码,感受一下,这份代码了良久啊,码艺不精,请见谅啊。
#include<stdio.h>
#include<stdlib.h>
typedef struct PolynomialNode* PolynomialLink;
typedef struct PolynomialNode{
int coef;//系数
int expon;//指数
PolynomialLink next;//指针指向下一项
}PolynomialNode;
/*
在尾部插入多项式的项
*/
void Attach(int coef,int expon,PolynomialLink *rear){
PolynomialLink temp;
temp = (PolynomialNode*)malloc(sizeof(PolynomialNode));
temp->coef = coef;
temp->expon = expon;
temp->next = NULL;
(*rear)->next = temp;
*rear = temp;
}
/*
读入多项式
*/
PolynomialLink ReadPoly(){
PolynomialLink p,rear,temp;
int n,c,e;
p = (PolynomialNode *)malloc(sizeof(PolynomialNode));
p->next = NULL;
rear = p;
//输入多项式有几项
scanf("%d",&n);
while(n--){
//按降幂的顺序输入每项的系数指数
scanf("%d%d",&c,&e);
Attach(c,e,&rear);
}
//删除头结点
temp = p;
p = p->next;
free(temp);
return p;
}
/*
输出多项式
*/
void PrintPoly(PolynomialLink p){
if(!p){
printf("0 0\n");
return ;
}
printf("%d %d",p->coef,p->expon);
p = p->next;
while(p){
printf(" %d %d",p->coef,p->expon);
p = p->next;
}
printf("\n");
}
/*
比较指数大小
*/
int Compare(int a,int b){
if(a>b){
return 1;
}
if(a<b){
return -1;
}
if(a == b){
return 0;
}
}
/*
对多项式求和
*/
PolynomialLink AddPoly(PolynomialLink p1,PolynomialLink p2){
PolynomialLink p,rear,t1,t2,temp;
t1 = p1;
t2 = p2;
//构造和多项式的头结点
p = (PolynomialNode *)malloc(sizeof(PolynomialNode));
p->next = NULL;
rear = p;
while(t1 && t2){
switch(Compare(t1->expon,t2->expon)){
case 1:{
Attach(t1->coef,t1->expon,&rear);
t1 = t1->next;
break;
}
case -1:{
Attach(t2->coef,t2->expon,&rear);
t2 = t2->next;
break;
}
case 0:{
int sum = t1->coef + t2->coef;
if(!sum){
t1 = t1->next;
t2 = t2->next;
break;
}
Attach(sum,t1->expon,&rear);
t1 = t1->next;
t2 = t2->next;
break;
}
default:{
break;
}
}
}
while(t1){
Attach(t1->coef,t1->expon,&rear);
t1 = t1->next;
}
while(t2){
Attach(t2->coef,t2->expon,&rear);
t2 = t2->next;
}
//释放头结点
temp = p;
p = p->next;
free(temp);
return p;
}
/*
对多项式求乘积
*/
PolynomialLink MultiPoly(PolynomialLink p1,PolynomialLink p2){
PolynomialLink p,rear,t1,t2,temp;
if(!p1 || !p2){
return NULL;
}
t1 = p1;
t2 = p2;
//构造和多项式的头结点
p = (PolynomialNode *)malloc(sizeof(PolynomialNode));
p->next = NULL;
rear = p;
while(t2){
Attach(t1->coef * t2->coef , t1->expon + t2->expon,&rear);
t2 = t2->next;
}
t1 = t1->next;
while(t1){
rear = p;
t2 = p2;
while(t2){
int c = (t1->coef) * (t2->coef);
int e = t1->expon + t2->expon;
while(rear->next && rear->next->expon > e){
rear = rear->next;
}
if(rear->next && rear->next->expon == e){
int sum = rear->next->coef+c;
if(sum){
rear->next->coef = sum;
} else {
temp = rear->next;
rear->next = temp->next;
free(temp);
}
} else {
temp = (PolynomialLink)malloc(sizeof(PolynomialNode));
temp->coef = c;
temp->expon = e;
temp->next = rear->next;
rear->next = temp;
rear = rear->next;
}
t2 = t2->next;
}
t1 = t1->next;
}
//释放头结点
temp = p;
p = p->next;
free(temp);
rear->next = NULL;
return p;
}
int main(void){
PolynomialLink p1,p2,pa,pm;
//读入多项式
p1 = ReadPoly();
p2 = ReadPoly();
// PrintPoly(p1);
// PrintPoly(p2);
//对多项式求乘积
pm = MultiPoly(p1,p2);
//对多项式求和
pa = AddPoly(p1,p2);
//输出多项式
PrintPoly(pm);
PrintPoly(pa);
return 0;
}