SHAOXIAOJ正在加载中...

1642: 线性表-两个多项式之和(Easy ver)

金币值:2 定数:8 时间限制:1.000 s 内存限制:128 M
解决:7 提交:18 正确率:38.89% 命题人:
点赞量:0 收藏量:0 题目类型:程序 来源/分类: 数据结构-线性表

题目描述

一元多项式(项的系数是实数,项的指数是整数)的求和(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()