问题描述
编写一个程序用单链表存储多项式,并实现两个一元多项式A与B相加的函数。A,B刚开始是无序的,A与B之和按降序排列。例如:
多项式A: 1.2X^0 2.5X^1 3.2X^3 -2.5X^5
多项式B: -1.2X^0 2.5X^1 3.2X^3 2.5X^5 5.4X^10
多项式A与B之和:5.4X^10 6.4X^3 5X^1
输入形式
任意两个多项式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项的系数与指数,系数与指数间用空格隔开,系数保留一位小数
#include <stdio.h>
#include <stdlib.h>
typedef struct Polynode
{
double coef;
int exp;
struct Polynode* next;
}Polynode;
Polynode* PolyCreate()
{
Polynode* head, * p;
Polynode *s = NULL;
head = (Polynode*)malloc(sizeof(Polynode));
p = head;
char c;
double b = 0;
int a = 0;
while ((c = getchar()) != '\n') {
int flag = 0;
if (c == '-') {
flag = 1;
c = getchar();
}
while (c != ' ' && c != '\n') {
if (c == '.') {
c = getchar();
b += ((double)c-48)/10;
}
else {
b = (b * 10) + (c - 48);
}
c = getchar();
}
if (flag == 1) b -= 2 * b;
if (a == 0) {
s=(Polynode*)malloc(sizeof(Polynode));
s->coef = b;
a = 1;
}
else {
s->exp = (int)b;
p->next = s;
p = p->next;
a = 0;
}
if (c == '\n')break;
b = 0;
}
p->next = NULL;
return head;
}
Polynode* Order(Polynode* L)
{
Polynode* p, * l, * s, * temp;
l = (Polynode*)malloc(sizeof(Polynode));
p = L->next;
s = (Polynode*)malloc(sizeof(Polynode));
s->coef = p->coef;
s->exp = p->exp;
s->next = NULL;
l->next = s;
p = p->next;
while (p)
{
if (p->exp > s->exp)
{
temp = l;
while (p->exp < temp->next->exp) temp = temp->next;
s = (Polynode*)malloc(sizeof(Polynode));
s->coef = p->coef;
s->exp = p->exp;
s->next = temp->next;
temp->next = s;
}
else if (p->exp < s->exp)
{
temp = s;
if (s->next == NULL)
{
s = (Polynode*)malloc(sizeof(Polynode));
s->coef = p->coef;
s->exp = p->exp;
s->next = NULL;
temp->next = s;
}
else
{
while ((temp->next != NULL) && (p->exp < temp->next->exp)) temp = temp->next;
s = (Polynode*)malloc(sizeof(Polynode));
s->coef = p->coef;
s->exp = p->exp;
if (temp->next == NULL)
{
temp->next = s;
s->next = NULL;
}
else
{
s->next = temp->next;
temp->next = s;
}
}
}
else
{
s->coef += p->coef;
if (s->coef == 0)
{
temp = l;
while (temp->next->exp != s->exp) temp = temp->next;
temp->next = s->next;
free(s);
}
}
p = p->next;
}
return l;
}
Polynode* Add(Polynode* a, Polynode* b)
{
Polynode* L, * p, * q, * s, * l;
L = (Polynode*)malloc(sizeof(Polynode));
p = a->next;
q = b->next;
l = L;
while (p && q)
{
s = (Polynode*)malloc(sizeof(Polynode));
if (p->exp > q->exp)
{
s->coef = p->coef;
s->exp = p->exp;
l->next = s;
p = p->next;
l = l->next;
}
else if (p->exp < q->exp)
{
s->coef = q->coef;
s->exp = q->exp;
l->next = s;
q = q->next;
l = l->next;
}
else
{
s->coef = p->coef + q->coef;
if (s->coef == 0)
{
free(s);
p = p->next;
q = q->next;
}
else
{
s->exp = p->exp;
l->next = s;
p = p->next;
q = q->next;
l = l->next;
}
}
}
if (p == NULL)
{
while (q)
{
s = (Polynode*)malloc(sizeof(Polynode));
s->coef = q->coef;
s->exp = q->exp;
l->next = s;
q = q->next;
l = l->next;
}
}
else if (q == NULL)
{
while (p)
{
s = (Polynode*)malloc(sizeof(Polynode));
s->coef = p->coef;
s->exp = p->exp;
l->next = s;
p = p->next;
l = l->next;
}
}
l->next = NULL;
return L;
}
int main()
{
Polynode* a, * b, * L1;
a = PolyCreate();
a = Order(a);
b = PolyCreate();
b = Order(b);
L1 = Add(a, b);
L1 = Order(L1);
int n;
scanf("%d", &n);
L1 = L1->next;
int i;
for (i = 1; i < n; ++i) L1 = L1->next;
printf("%.1f %d\n", L1->coef, L1->exp);
return 0;
}