2.一元多项式相加

2.一元多项式相加

成绩 10 开启时间 2014年10月19日 Sunday 00:00
折扣 0.8 折扣时间 2014年11月2日 Sunday 23:55
允许迟交 关闭时间 2014年11月9日 Sunday 23:55

题目说明:

编写一元多项式加法运算程序。要求用线性链表存储一元多项式(参照课本)。该程序有以下几个功能:

1. 多项式求和

输入:输入三个多项式,建立三个多项式链表PaPbPc

(提示:调用CreatePolyn(polynomial &P,int m)

输出:显示三个输入多项式PaPbPc、和多项式Pa+Pb、多项式Pa+Pb+Pc

(提示:调用AddPolyn(polynomial &Pa, polynomial Pb), 调用PrintPolyn(polynomial P))

0. 退出

输入:

根据所选功能的不同,输入格式要求如下所示(第一个数据是功能选择编号,参见测试用例):

  • 1

多项式A包含的项数,以指数递增的顺序输入多项式A各项的系数(整数)、指数(整数)

多项式B包含的项数,以指数递增的顺序输入多项式B各项的系数(整数)、指数(整数)

多项式C包含的项数,以指数递增的顺序输入多项式C各项的系数(整数)、指数(整数)

  • ---操作终止,退出。

输出:

对应一组输入,输出一次操作的结果(参见测试用例)。

  • 多项式输出格式:以指数递增的顺序输出: <系数,指数>,<系数,指数>,<系数,指数>,参见测试用例。零多项式的输出格式为<0,0>

  • 无输出
  测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 1↵
  2. 2↵
  3. 1 1 2 2↵
  4. 2↵
  5. 1 1 2 2↵
  6. 2↵
  7. 1 1 2 2↵
以文本方式显示
  1. <1,1>,<2,2>↵
  2. <1,1>,<2,2>↵
  3. <1,1>,<2,2>↵
  4. <2,1>,<4,2>↵
  5. <3,1>,<6,2>↵
1秒 1024KB 0
测试用例 2 以文本方式显示
  1. 1↵
  2. 2↵
  3. 6 3 8 6↵
  4. 2↵
  5. 3 4 4 8↵
  6. 3↵
  7. 1 1 5 5 9 9↵
以文本方式显示
  1. <6,3>,<8,6>↵
  2. <3,4>,<4,8>↵
  3. <1,1>,<5,5>,<9,9>↵
  4. <6,3>,<3,4>,<8,6>,<4,8>↵
  5. <1,1>,<6,3>,<3,4>,<5,5>,<8,6>,<4,8>,<9,9>↵
1秒 1024KB 0
测试用例 3 以文本方式显示
  1. 1↵
  2. 2↵
  3. 1 1 2 2↵
  4. 2↵
  5. -1 1 -2 2↵
  6. 2↵
  7. 1 1 2 2↵
以文本方式显示
  1. <1,1>,<2,2>↵
  2. <-1,1>,<-2,2>↵
  3. <1,1>,<2,2>↵
  4. <0,0>↵
  5. <1,1>,<2,2>↵
1秒 1024KB 0
#include<stdio.h>
#define LEN sizeof(struct node)
typedef struct node{
	int k;
	int e;
	struct node *next;
}Node;
struct node *in(int num){
	int i;
	struct node *head,*p,*p1;
	p1 = (Node *)malloc(LEN);
	scanf("%d%d", &p1->k, &p1->e);
	head = p1;
	for (i = 1; i < num; i++){
		p = (Node *)malloc(LEN);
		scanf("%d%d", &p->k, &p->e);
		p1->next = p;
		p1 = p;
	}
	p1->next = NULL;
	return head;
}
struct node *add1(struct node *a, struct node *b)
{
	struct node *head,*p,*p1;
	if (a->k == 0)
		return b;
	if (b->k == 0)
		return a;
	p = (Node *)malloc(LEN);
	while (1){
		if (a == NULL || b == NULL){
			p->k = 0;
			p->e = 0;
			p->next = NULL;
			return p;
		}
		if (a->e < b->e){
			p->e = a->e;
			p->k = a->k;
			a = a->next;
			break;
		}
		else{
			if (a->e>b->e){
				p->e = b->e;
				p->k = b->k;
				b = b->next;
				break;
			}
			else{
				int tt;
				tt = a->k + b->k;
				if (tt != 0){
					p->e = a->e;
					p->k = tt;
					a = a->next;
					b = b->next;
					break;
				}
				else{
					a = a->next;
					b = b->next;
				}
			}
		}
	}
	head = p1 = p;
	while (a != NULL&&b != NULL){
		p = (Node *)malloc(LEN);
		if (a->e < b->e){
			p->e = a->e;
			p->k = a->k;
			a = a->next;
			p1->next = p;
			p1 = p;
		}
		else{
			if (a->e>b->e){
				p->e = b->e;
				p->k = b->k;
				b = b->next;
				p1->next = p;
				p1 = p;
			}
			else{
				int tt;
				tt = a->k + b->k;
				if (tt != 0){
					p->e = a->e;
					p->k = tt;
					a = a->next;
					b = b->next;
					p1->next = p;
					p1 = p;
				}
				else{
					a = a->next;
					b = b->next;
				}
			}
		}
	}
	while (a != NULL){
		p = (Node *)malloc(LEN);
		p->e = a->e;
		p->k = a->k;
		p1->next = p;
		p1 = p;
		a = a->next;
	}
	while (b != NULL){
		p = (Node *)malloc(LEN);
		p->e = b->e;
		p->k = b->k;
		p1->next = p;
		p1 = p;
		b = b->next;
	}
	p1->next = NULL;
	return head;
}
void prt(struct node *head)
{
	if (head->k==0)
		printf("<0,0>\n");
	else{
		while (head->next != NULL){
			printf("<%d,%d>,", head->k, head->e);
			head = head->next;
		}
		printf("<%d,%d>\n", head->k, head->e);
	}
}
int main()
{
	int cmd;
	int i;
	int a, b, c;
	struct node *head_a, *head_b, *head_c;
	struct node *temp;
	struct node *add_1, *add_2;
	while (scanf("%d", &cmd) != EOF){
		if (cmd == 0)
			break;
		scanf("%d", &a);
		head_a = in(a);
		scanf("%d", &b);
		head_b = in(b);
		scanf("%d", &c);
		head_c = in(c);
		temp = head_a;
		for (i = 1; i < a; i++){
			printf("<%d,%d>,", temp->k, temp->e);
			temp = temp->next;
		}
		printf("<%d,%d>\n", temp->k, temp->e);
		temp = head_b;
		for (i = 1; i < b; i++){
			printf("<%d,%d>,", temp->k, temp->e);
			temp = temp->next;
		}
		printf("<%d,%d>\n", temp->k, temp->e);
		temp = head_c;
		for (i = 1; i < c; i++){
			printf("<%d,%d>,", temp->k, temp->e);
			temp = temp->next;
		}
		printf("<%d,%d>\n", temp->k, temp->e);
		add_1 = add1(head_a, head_b);
		prt(add_1);

		add_2 = add1(add_1, head_c);
		prt(add_2);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值