多项式相加
【问题描述】
编写一个程序用单链表存储多项式,并实现两个一元多项式A与B相加的函数。A,B刚开始是无序的,A与B之和按降序排列。例如:
多项式A: 1.2X0 + 2.5X1 + 3.2X3 - 2.5X5
多项式B: -1.2X0 + 2.5X1 + 3.2X3 + 2.5X5 + 5.4X10
多项式A与B之和:5.4X10 + 6.4X3 + 5X1
【输入形式】
任意两个多项式A和B
【输出形式】
多项式中某一项的系数与指数,系数保留一位小数
【输入样例】
1.2 0 2.5 1 3.2 3 -2.5 5
-1.2 0 2.5 1 3.2 3 2.5 5 5.4 10
2
【输出样例】
6.4 3
【样例说明】
第一个多项式的系数与指数对,以空格隔开
第二个多项式的系数与指数对,以空格隔开
输出第2项的系数与指数,系数与指数间用空格隔开,系数保留一位小数
分析
- 此题的实现分为两个版本:数组版本与链表版本。
- 数组版本的思想是通过一维数组来储存多项式的系数与指数,指数作为数组的索引,而系数则作为数组索引对应的数值。
- 链表版本则是通过包含指数、系数、下一节点指针的结构体,按照顺序读取数据,当新读取的数据是出现过的指数时,则将其对应的系数相加;如果不相等,则按照由大到小的顺序,对链表实行插入操作,以此来使链表是按照多项式的指数由大到小进行排序。
- 需要注意的是,本题并没有指定每一行数据的个数,因此何时停止获取输入便成了一个问题,本人采取的做法是:由于数据通过空格分隔,因此每次通过scanf获取两个数据,然后通过getchar获取下一个字符,如果下一个字符不是空格,则说明本行已经没有数据了,便可以结束本行的数据读取。
代码
链表版
#include<stdio.h>
#include<stdlib.h>
#define max 1000
typedef struct NODE* Node;
struct NODE {
int x1; //指数
float x2; //系数
Node next;
};
Node init(int x1, float x2)
{
Node n = (Node)malloc(sizeof(struct NODE));
n->x1 = x1;
n->x2 = x2;
n->next = NULL;
return n;
}
Node insert(Node H, Node r)
{
Node p = H;
int flag = 0;
if (!H->next) { //链表空状态
H->next = r;
return H;
}
while (p->next) {
Node q = p->next;
if (q->x1 > r->x1) { //若新数据的指数较小,则往后放
p = p->next;
continue;
}
else if (q->x1 == r->x1) q->x2 = q->x2 + r->x2; //两数据的指数相同时,其系数相加
else if (q->x1 < r->x1) { //新数据的指数大,则插入该节点前面
r->next = p->next;
p->next = r;
}
flag++;
break;
}
if (!flag) p->next = r; //遍历完链表,则将新数据插入到最后一个节点
return H;
}
Node creat(Node H)
{
int i;
for (i = 0; i < max; i++) {
float t1;
int t2;
scanf("%f %d", &t1, &t2);
Node p = init(t2, t1);
H = insert(H, p);
char c = getchar(); //字符为空格时才会继续读取数据
if (c != ' ') break;
}
return H;
}
void output(Node H, int index)
{
int i = 0;
Node p = H;
while(1){
i++;
p = p->next;
if (p->x2 == 0) i--; //系数为0的项不计数
if (i == index) {
printf("%.1f %d", p->x2, p->x1);
break;
}
}
}
int main()
{
Node H = init(0, 0);
H = creat(H);
H = creat(H);
int index;
scanf("%d", &index);
output(H, index);
return 0;
}
数组版
#include<stdio.h>
#define max 1000
float a1[1005], a2[1005], a3[1005];
void print(float a[], int maxsize, int index)
{
int i, flag = 0;
for (i = maxsize; i >= 0; --i) {
if (a[i]) flag++; //找到期望输出的索引
if (flag == index) {
printf("%.1f %d", a[i], i);
break;
}
}
}
void input(float* t)
{
int i, t2;
float t1;
for (i = 0; i < max; i++) {
scanf("%f %d", &t1, &t2);
t[t2] = t1;
char c = getchar();
if (c != ' ') break;
}
}
int main()
{
int i, index;
input(a1);
input(a2);
scanf("%d", &index);
for (i = 0; i <= max; i++)
a3[i] = a1[i] + a2[i]; //对应系数相加
print(a3, max, index);
return 0;
}