1642: 线性表-两个多项式之和(Easy ver)
金币值:2
定数:8
时间限制:1.000 s
内存限制:128 M
解决:7
提交:18
正确率:38.89% 命题人:
题目描述
一元多项式(项的系数是实数,项的指数是整数)的求和(pc=pa+pb)操作在链式存储结构上的实现。其中函数initList用于完成链表的初始化;locateElem用于寻找待插入结点的前驱结点;listInsert用于结点的插入;addMutiPloy用于实现计算两个一元多项式的和;inputList的功能是建立"降序"排列的多项式(采用的是直接插入排序方法);printList的功能是从单链表头部开始顺序打印单链表中的结点元素。
输入
第1行:第一个多项式的项数
第2行:第一个多项式的各项系数和指数,以空隔间隔
第3行:第二个多项式的项数
第4行:第二个多项式的各项系数和指数,以空隔间隔
输出
两多项式之和,根据指数从高到低输出(系数精确到小数后1位),如果多项式之和为0,则显示0
样例输入 复制
4
70 7 50 5 10 1 30 3
3
60 6 20 2 -50 5
样例输出 复制
70.0 7
60.0 6
30.0 3
20.0 2
10.0 1
提示
#include <stdio.h>
#include <stdlib.h>
// 假设多项式降序排列
typedef struct LNode {
double coef;
int expn;
struct LNode *next;
} LNode, *linkList;
void initList(linkList &L);
void inputList(linkList L);
void listInsert(linkList &L,double coef,int expn);
linkList locateElem (linkList L,int e);
void printList(linkList L);
void addMutiPloy(linkList pa,linkList pb,linkList pc);
int main(void) {
linkList pa,pb,pc;
initList(pa);
inputList(pa);
initList(pb);
inputList(pb);
initList(pc);
addMutiPloy(pa,pb,pc);
printList(pc);
return 0;
}
void initList(linkList &L) {
L=(linkList)malloc(sizeof(LNode));
L->next=NULL;
}
void inputList(linkList L) {
int n;
double coef;
int expn;
scanf("%d",&n);
for(int i=0; i<n; i++) {
scanf("%lf %d",&coef,&expn);
listInsert(L,coef,expn); // 插入时仍然保持线性表有序
}
}
void listInsert(linkList &L,double coef,int expn) {
linkList p=(linkList)malloc(sizeof(LNode));
p->coef=coef;
p->expn=expn;
p->next=NULL;
linkList t=locateElem(L,expn);
p->next=t->next;
t->next=p; // 在t指向的结点之后插入p指向的结点
}
linkList locateElem (linkList L,int e) {
linkList pre,p;
for(pre=L,p=L->next; p!=NULL; pre=p,p=p->next)
if(p->expn<e) return pre;
return pre;
}
void addMutiPloy(linkList pa,linkList pb,linkList pc) {
linkList p1,p2,p3;
p1=pa->next;
p2=pb->next;
p3=pc;
while(p1!=NULL && p2!=NULL) {
if(p1->expn>p2->expn) {
} else if(p1->expn<p2->expn) {
} else if(p1->expn==p2->expn) {
double sum = p1->coef + p2->coef;
if(sum!=0) {
} else {
}
}
}
p3->next=(p1!=NULL?p1:p2); //插入非空多项式的剩余段
}
void printList(linkList L) {
linkList p = L->next;
if(p==NULL) printf("%d\n",0);
else while(p!=NULL) {
printf("%.1lf %d\n",p->coef,p->expn);
p = p->next;
}
}
注意“自上而下,逐步细化,结构化,模块化”的程序设计思想。例如: main()->inputList()->listInsert()->locateElem()