本文思路参考:https://blog.csdn.net/seu_nuaa_zc/article/details/73136455
题目如下:
#include
#include
/** =====================存储结构定义 开始======================= */
#define MAX_SIZE 128
/*顺序表中元素的类型,描述多项式中每一项的系数和指数*/
typedef struct _Elem
{
int coe; /*系数*/
int exp; /*指数*/
} Elem;
typedef struct _SeqMult
{
Elem data[MAX_SIZE];
int last;
} SeqMult;
void sm_init(SeqMult *ptr_sm);/*插入成功返回1,插入失败返回0;*/
void sm_create(SeqMult *ptr_sm);
void sm_print(SeqMult *ptr_sm);
void sm_add(SeqMult *ptr_sm1, SeqMult *ptr_sm2, SeqMult *ptr_res);
/****************
* 多项式相加
* @param ptr_sm1 第一个多项式
* @param ptr_sm2 第二个多项式
* @param ptr_res 相加结果
****************************************/
int main()
{
SeqMult sm1, sm2, sm_res, *ptr_sm1, *ptr_sm2, *ptr_res;
ptr_sm1 = &sm1;
ptr_sm2 = &sm2;
ptr_res = &sm_res;
/*初始化空*/
sm_init(ptr_sm1);
sm_init(ptr_sm2);
sm_init(ptr_res);
sm_create(ptr_sm1);/*创建第一个多项式*/
sm_print(ptr_sm1);
sm_create(ptr_sm2);/*创建第二个多项式*/
sm_print(ptr_sm2);/*输出第二个多项式*/
sm_add(ptr_sm1,ptr_sm2, ptr_res);/*相加*/
sm_print(ptr_res);/*输出结果*/
return(0);
}
void sm_init(SeqMult *ptr_sm)
{
ptr_sm->last = -1;
}
int sm_insert(SeqMult *ptr_sm, int coe, int exp)
{
/*填写代码,完成多项式插入功能*/
/*
注意:
1. ptr_sm指向当前的多项式顺序表
2. 当前多项式顺序表按照每一项的的指数递增有序。
3. 插入后,当前的多项式顺序表依然按照指数递增有序
*/
}
void sm_create(SeqMult *ptr_sm)
{
int count, i;
int coe, exp;
int ok;
scanf("%d", &count);
ok = 1;
for(i=0; i<count; i++)
{
scanf("%d(%d)", &coe, &exp);
ok = sm_insert(ptr_sm, coe, exp);
if(!ok) {
break;
}
}
}
void sm_print(SeqMult *ptr_sm)
{
int i;
for(i=0; i<=ptr_sm->last; i++) {
if(i != 0) {
if(ptr_sm->data[i].coe > 0) {
printf(" + ");
}
else if(ptr_sm->data[i].coe < 0) {
printf(" - ");
}
printf("%d*X^%d", abs(ptr_sm->data[i].coe), ptr_sm->data[i].exp);
}
else {
printf("%d*X^%d", ptr_sm->data[i].coe, ptr_sm->data[i].exp);
}
}
printf("\n");
}
void sm_add(SeqMult *ptr_sm1, SeqMult *ptr_sm2, SeqMult *ptr_res)
{
/*填写代码,完成多项式相加功能*/
/*
注意:
1. ptr_sm1,ptr_sm2分别指向相加的两个多项式顺序表
2. ptr_res指向的多项式顺序表将被清空,相加的结果存储到ptr_res指向的顺序表中。
3. ptr_sm1,ptr_sm2多项式都按照指数递增有序
*/
}
已知大致函数结构,补齐插入函数和多项式相加函数。
思路如下 :
1、插入后,首先有一个排序过程为题目要求,按照指数大小排序,这里我们采用简单的顺序表插入方法+冒泡排序实现。
int sm_insert(SeqMult *ptr_sm, int coe, int exp)
{
Elem tmp;
int i, j;
if (ptr_sm->last == MAX_SIZE - 1)
{
return 0;
}
ptr_sm->last++;
ptr_sm->data[ptr_sm->last].coe = coe;
ptr_sm->data[ptr_sm->last].exp = exp;
for (i = 1; i<=ptr_sm->last; i++)
{
tmp = ptr_sm->data[i];
j = i - 1;
while (j >= 0 && ptr_sm->data[j].exp > tmp.exp)
{
ptr_sm->data[j + 1] = ptr_sm->data[j];
j--;
}
ptr_sm->data[j + 1] = tmp;
}
return 1;
}
2、进行多项式相加时,先逐个判断相同项,当有相同项时,进行相加。
3、若无出现相同项,则放到最后进行处理。
void sm_add(SeqMult *ptr_sm1, SeqMult *ptr_sm2, SeqMult *ptr_res)
{
int i = 0, j = 0, k = 0;
float c;
while (i < ptr_sm1->last + 1 && j < ptr_sm2->last + 1)
{
if (ptr_sm1->data[i].exp < ptr_sm2->data[j].exp)
{
ptr_res->data[k].exp = ptr_sm1->data[i].exp;
ptr_res->data[k].coe = ptr_sm1->data[i].coe;
i++;
k++;
}
else if (ptr_sm1->data[i].exp > ptr_sm2->data[j].exp)
{
ptr_res->data[k].exp = ptr_sm2->data[j].exp;
ptr_res->data[k].coe = ptr_sm2->data[j].coe;
j++;
k++;
}
else
{
c = ptr_sm1->data[i].coe + ptr_sm2->data[j].coe;
if (c != 0)
{
ptr_res->data[k].exp = ptr_sm1->data[i].exp;
ptr_res->data[k].coe = c;
k++;
}
i++;
j++;
}
}
while (i < ptr_sm1->last+1 )
{
ptr_res->data[k].exp = ptr_sm1->data[i].exp;
ptr_res->data[k].coe = ptr_sm1->data[i].coe;
i++;
k++;
}
while (j < ptr_sm2->last+1 )
{
ptr_res->data[k].exp = ptr_sm2->data[j].exp;
ptr_res->data[k].coe = ptr_sm2->data[j].coe;
j++;
k++;
}
ptr_res->last = k-1;
}
本文只用于记录学习经验。
代码从华为云复制到这里的过程中可能出现问题,若有问题,请指出,谢谢。