前言
真的醉了,写了一个下午。一开始感觉题目离不了数据的调用,因此使用了线性表的方法,写的时候那叫一个折磨。但我认为我提供了一个不同于链表的方法,还是打算分享给大家。我是伞兵
题目
设计函数分别求两个一元多项式的乘积与和。
题目真的很抽象,我们这样理解。
第一行 4 3x4-5x2+6x1-2x0
第二行 3 5x20-7x4+3x1
把两个多项式相乘,相加,输出类似的结果。如果相乘或相加后是0,输出0 0。
代码分析
主函数
#include<stdio.h>
#include<stdlib.h>
#define MAX 1001
typedef struct LNode* List;
struct LNode
{
int num;//存这个多项式个数
int Data[MAX];//存多项式的数字部分
int Index[MAX];//存多项式的指数部分
};
void multiply(List M1, List M2);//乘法,M1和M2是输入的两个多项式
void add(List M1, List M2);//加法
//线性表的数据插入,X是数字,Y是指数,K是插入位置
void Insert(List ad, int X, int Y, int K);
int main()
{
//定义2个线性表
int i;
List M1, M2;
M1 = (List)malloc(sizeof(struct LNode));
M2 = (List)malloc(sizeof(struct LNode));
//输入表达式
scanf("%d", &M1->num);
for (i = 0; i < M1->num; i++)
{
scanf("%d", &M1->Data[i]);
scanf("%d", &M1->Index[i]);
}
scanf("%d", &M2->num);
for (i = 0; i < M2->num; i++)
{
scanf("%d", &M2->Data[i]);
scanf("%d", &M2->Index[i]);
}
multiply(M1, M2);//输出乘法的结果
add(M1, M2);//输出加法结果
return 0;
}
乘法函数
方法有些复杂,但好理解。我们用M1的第一个项、第二个项……分别乘以M2第一个项,再分别乘以M2第二个项……输出所有的结果到新的线性表mul中。
考虑到排在后面的指数更大的情况,所以我们对输出的线性表从大到小排序。
之后遍历线性表,把相同指数的项加起来,如果加起来后数字为0,就删除这一项。
void multiply(List M1, List M2)
{
List mul,realmul;//real就是排序后的线性表
mul = (List)malloc(sizeof(struct LNode));
realmul = (List)malloc(sizeof(struct LNode));
int i, j;
int maxData, maxIndex;
mul->num = 0;
//得到所有相乘的结果
for (j = 0; j < M2->num; j++)
{
for (i = 0; i < M1->num; i++)
{
mul->Data[mul->num] = M1->Data[i] * M2->Data[j];
mul->Index[mul->num] = M1->Index[i] + M2->Index[j];
mul->num++;
}
}
//使用冒泡法排序
for (i = 0; i < mul->num; i++)
{
for (j = 1; j < mul->num; j++)
{
if (mul->Index[j - 1] < mul->Index[j])
{
maxIndex = mul->Index[j];
maxData = mul->Data[j];
mul->Index[j] = mul->Index[j - 1];
mul->Data[j] = mul->Data[j - 1];
mul->Index[j - 1] = maxIndex;
mul->Data[j - 1] = maxData;
}
}
}//排序结束
//相同项相加
realmul->Data[0] = mul->Data[0];
realmul->Index[0] = mul->Index[0];
for (i = 1, j = 0; i < mul->num; i++)
{
//原理就是排序后相同指数排在一起
//所以如果上一个和当前的指数相同,就相加。
if (mul->Index[i] == mul->Index[i - 1])
{
realmul->Data[j] += mul->Data[i];
if (realmul->Data[j] == 0)//防止合并出现0
j--;
}
else//不相同就顺序放入
{
j++;
realmul->Data[j] = mul->Data[i];
realmul->Index[j] = mul->Index[i];
}
}
realmul->num = j + 1;
//最后没有数据,就输出0 0
if (realmul->num == 0)
printf("0 0");
//输出结果
else
{
printf("%d %d", realmul->Data[0], realmul->Index[0]);
for (i = 1; i < realmul->num; i++)
printf(" %d %d", realmul->Data[i], realmul->Index[i]);
printf("\n");
}
return;
}
加法函数、插入函数
我采用的方法是逐个添加的方法。首先我们把M1复制到ad中,然后把M2中每个指数来比较。如果大于,就插入到前面,如果等于,就把该指数对应的系数相加,如果小于,就继续和下一个比较。比较完后,如果M2没有完全输出,此时再把M2依此插入最后面。
void add(List M1, List M2)
{
List ad;
ad = (List)malloc(sizeof(struct LNode));
ad->num = 0;
int i = 0, j = 0;
//复制M1
for (i = 0; i < M1->num; i++)
{
ad->Data[i] = M1->Data[i];
ad->Index[i] = M1->Index[i];
ad->num++;
}
//M2开始比较
for (i = 0; i < ad->num; i++)
{
if (M2->Index[j] > ad->Index[i])
{
Insert(ad, M2->Data[j], M2->Index[j], i);
j++;
}
else if (M2->Index[j] == ad->Index[i])
{
ad->Data[i] += M2->Data[j];
if (ad->Data[i] == 0)
{
for (int k = i; k < ad->num - 1; k++)
{
ad->Data[k] = ad->Data[k + 1];
ad->Index[k] = ad->Index[k + 1];
}
ad->num--;
i--;
}
j++;
}
}
//如果结果没有输出完,依次插入
for (j; j < M2->num; j++)
{
ad->Data[ad->num] = M2->Data[j];
ad->Index[ad->num] = M2->Index[j];
ad->num++;
}
//输出结果
if (ad->num == 0)
printf("0 0");
else
{
printf("%d %d", ad->Data[0], ad->Index[0]);
for (i = 1; i < ad->num; i++)
printf(" %d %d", ad->Data[i], ad->Index[i]);
}
return;
}
//插入函数
//依次把K后面的数往后挪一位,之后把需要添加的东西放在K的位置上。
void Insert(List ad, int X, int Y, int K)
{
int i;
for (i = ad->num - 1; i >= K; i--)
{
ad->Data[i + 1] = ad->Data[i];
ad->Index[i + 1] = ad->Index[i];
}
ad->num++;
i++;
ad->Data[i] = X;
ad->Index[i] = Y;
return;
}
代码实现
#include<stdio.h>
#include<stdlib.h>
#define MAX 1001
typedef struct LNode* List;
struct LNode
{
int num;//存数量
int Data[MAX];
int Index[MAX];
};
void multiply(List M1, List M2);
void add(List M1, List M2);
void Insert(List ad, int X, int Y, int K);
int main()
{
//定义4个线性表
int i;
List M1, M2;
M1 = (List)malloc(sizeof(struct LNode));
M2 = (List)malloc(sizeof(struct LNode));
scanf("%d", &M1->num);
for (i = 0; i < M1->num; i++)
{
scanf("%d", &M1->Data[i]);
scanf("%d", &M1->Index[i]);
}
scanf("%d", &M2->num);
for (i = 0; i < M2->num; i++)
{
scanf("%d", &M2->Data[i]);
scanf("%d", &M2->Index[i]);
}
multiply(M1, M2);
add(M1, M2);
return 0;
}
void multiply(List M1, List M2)
{
List mul,realmul;//把乘的结果放入此线性表中
mul = (List)malloc(sizeof(struct LNode));
realmul = (List)malloc(sizeof(struct LNode));
int i, j;
int maxData, maxIndex;
mul->num = 0;
for (j = 0; j < M2->num; j++)
{
for (i = 0; i < M1->num; i++)
{
mul->Data[mul->num] = M1->Data[i] * M2->Data[j];
mul->Index[mul->num] = M1->Index[i] + M2->Index[j];
mul->num++;
}
}
for (i = 0; i < mul->num; i++)
{
for (j = 1; j < mul->num; j++)
{
if (mul->Index[j - 1] < mul->Index[j])
{
maxIndex = mul->Index[j];
maxData = mul->Data[j];
mul->Index[j] = mul->Index[j - 1];
mul->Data[j] = mul->Data[j - 1];
mul->Index[j - 1] = maxIndex;
mul->Data[j - 1] = maxData;
}
}
}//排序结束
realmul->Data[0] = mul->Data[0];
realmul->Index[0] = mul->Index[0];
for (i = 1, j = 0; i < mul->num; i++)
{
if (mul->Index[i] == mul->Index[i - 1])
{
realmul->Data[j] += mul->Data[i];
if (realmul->Data[j] == 0)//防止合并出现0
j--;
}
else
{
j++;
realmul->Data[j] = mul->Data[i];
realmul->Index[j] = mul->Index[i];
}
}
realmul->num = j + 1;
if (realmul->num == 0)
printf("0 0");
else
{
printf("%d %d", realmul->Data[0], realmul->Index[0]);
for (i = 1; i < realmul->num; i++)
printf(" %d %d", realmul->Data[i], realmul->Index[i]);
printf("\n");
}
return;
}
void add(List M1, List M2)
{
List ad;
ad = (List)malloc(sizeof(struct LNode));
ad->num = 0;
int i = 0, j = 0;
for (i = 0; i < M1->num; i++)
{
ad->Data[i] = M1->Data[i];
ad->Index[i] = M1->Index[i];
ad->num++;
}
for (i = 0; i < ad->num; i++)
{
if (M2->Index[j] > ad->Index[i])
{
Insert(ad, M2->Data[j], M2->Index[j], i);
j++;
}
else if (M2->Index[j] == ad->Index[i])
{
ad->Data[i] += M2->Data[j];
if (ad->Data[i] == 0)
{
for (int k = i; k < ad->num - 1; k++)
{
ad->Data[k] = ad->Data[k + 1];
ad->Index[k] = ad->Index[k + 1];
}
ad->num--;
i--;
}
j++;
}
}
for (j; j < M2->num; j++)
{
ad->Data[ad->num] = M2->Data[j];
ad->Index[ad->num] = M2->Index[j];
ad->num++;
}
if (ad->num == 0)
printf("0 0");
else
{
printf("%d %d", ad->Data[0], ad->Index[0]);
for (i = 1; i < ad->num; i++)
printf(" %d %d", ad->Data[i], ad->Index[i]);
}
return;
}
void Insert(List ad, int X, int Y, int K)
{
int i;
for (i = ad->num - 1; i >= K; i--)
{
ad->Data[i + 1] = ad->Data[i];
ad->Index[i + 1] = ad->Index[i];
}
ad->num++;
i++;
ad->Data[i] = X;
ad->Index[i] = Y;
return;
}