02-线性结构2 一元多项式的乘法与加法运算

02-线性结构2 一元多项式的乘法与加法运算 (20 分)
设计函数分别求两个一元多项式的乘积与和。

输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。

输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

//单链表实现,刚开始借鉴了一个博主的程序,后修改。

#include<bits/stdc++.h>
using namespace std;
typedef struct Node* polynode;
struct Node{
	int c;
	int e;
	polynode next;
}; 
//polynode polyread(){
//	polynode p,rear,tmp;
//	p=(polynode)malloc(sizeof(struct Node));
//	p->c=p->e=0;
//	p->next=NULL;
//	rear=p;
//	int n,c1,e1;
//	cin>>n;
//	while(n--){
//		cin>>c1>>e1;
//		tmp=(polynode)malloc(sizeof(struct Node));
//		tmp->c=c1;
//		tmp->e=e1;
//		rear->next=tmp;
//		tmp->next=NULL;
//		rear=tmp;
//	}
//	return p;
//}

polynode polyread()
{
    polynode p,tmp,rear;
    int n,c,e;
    scanf("%d",&n);
    p = (polynode)malloc(sizeof(struct Node));
    p->c=p->e=0;
    p->next=NULL;
    rear = p;
    if(n==0){
    return p;
    }
    while(n--){
        scanf("%d %d",&c,&e);
        tmp = (polynode)malloc(sizeof(struct Node));
        tmp->c=c;
        tmp->e=e;
        rear->next=tmp;
        tmp->next=NULL;
        rear=tmp;
    }
    return p;
}


int printpoly(polynode p)
{
    int flag=0;
    if(!(p->next)){
        printf("0 0\n");
        return 0;
    }else{
        p=p->next;
    }
    while(p){
    if(!flag){
        flag+=1;
    }else{
        printf(" ");
    }
    printf("%d %d",p->c,p->e);
    p=p->next;
    }
    printf("\n");
    return 0;
}

//int printpoly(polynode p){
//	int flag;
//	if(!(p->next)){
//		cout<<"0 0"<<endl;
//		return 0;
//	}else{
//		p=p->next;
//	} 
//	while(p){
//	if(!flag){
//		flag=1;
//	}else{
//		cout<<" ";
//	}
//	cout<<p->c<<" "<<p->e;
//	p=p->next; 
//	}
//	cout<<endl;
//	return 0;
//}
//之所以使用*prear指针是因为其需要使用自传递,使得rear的值在attach中发生改变 
void attach(int c,int e,polynode *prear){
	polynode tmp;
	tmp=(polynode)malloc(sizeof(struct Node));
	tmp->c=c;
	tmp->e=e;
	tmp->next=NULL;
	(*prear)->next=tmp;
	*prear=tmp;
}

polynode mult(polynode p1,polynode p2){
	polynode p,rear,t1,t2,t;
	int c,e;
	t1=p1->next;
	t2=p2->next;
	p=(polynode)malloc(sizeof(struct Node));
	p->c=p->e=0;
	p->next=NULL;
	rear=p; 
	if(!t1||!t2) return p;
	while(t2){
		c = t1->c*t2->c;
		e = t1->e+t2->e;
		attach(c,e,&rear);
		t2 = t2->next;
	}
	t1=t1->next;
	while(t1){
		t2=p2->next;rear=p;
		while(t2){
			c = t1->c*t2->c;
			e = t1->e+t2->e;
			while(rear->next&&(rear->next->e>e)){
				rear=rear->next;
			}
			if(rear->next&&rear->next->e==e){
				if(rear->next->c+c){
					rear->next->c+=c;
				}else{
					t=rear->next;
					rear->next=t->next;
					free(t);
				}
			}else{
				t=(polynode)malloc(sizeof(struct Node));
				t->c=c;
				t->e=e;
//				rear->next=t;
//				rear=t;
				t->next=rear->next;
				rear->next=t;
				rear=rear->next;
			}
			t2=t2->next;
		}
		t1=t1->next;
	}
	return  p;
}
//polynode add(polynode p1,polynode p2){
//	polynode p,rear,t1,t2,tmp;
//	p=(polynode)malloc(sizeof(struct Node));
//	p->next=NULL;
//	p->c=p->e=0; 
//	rear = p;
//	t1=p1->next;
//	t2=p2->next;
//	while(t1 || t2){
//		if(t1->e>t2->e){
//			rear->next=t2;
//			rear=t2;
//			t2=t2->next;
//		}else if(t1->e==t2->e){
//			if(t1->c+t2->c==0){
//				t1=t1->next;
//				t2=t2->next;
//			}else{
//				tmp=(polynode)malloc(sizeof(struct Node));
//				tmp->c=t1->c+t2->c;
//				tmp->e=t1->e+t2->e;
//				t1=t1->next;
//				t2=t2->next;
//				rear->next=tmp;
//				rear=tmp; 
//			}
//		}else{
//			rear->next=t1;
//			rear=t1;
//			t1=t1->next;	
//			}
//		}
//	for(;t1;t1=t1->next) attach(t1->c,t1->e,&rear);
//	for(;t2;t2=t2->next) attach(t2->c,t2->e,&rear);
//	rear->next=NULL;
//	return p;
//}

int compare(int a,int b)
{
    if(a>b)return 1;
    if(a==b)return 0;
    return -1;
}

polynode add(polynode p1, polynode p2)
{
    polynode p,rear,tmp;
    int sum;
    p = (polynode)malloc(sizeof(struct Node));
    p->next=NULL;
    rear=p;
    p1=p1->next;
    p2=p2->next;
    while(p1&&p2)
        switch(compare(p1->e,p2->e)){
            case 1:
                attach(p1->c,p1->e,&rear);
                p1=p1->next;
                break;
            case -1:
                attach(p2->c,p2->e,&rear);
                p2=p2->next;
                break;
            case 0:
                sum = p1->c+p2->c;
                if(sum)attach(sum,p1->e,&rear);
                p1=p1->next;
                p2=p2->next;
                break;

        }

    for(;p1;p1=p1->next)attach(p1->c,p1->e,&rear);
    for(;p2;p2=p2->next)attach(p2->c,p2->e,&rear);
    rear->next=NULL;
    return p;
}


int main(){
	freopen("1.txt","r",stdin);
	polynode mul,ad,p1,p2;
	p1=polyread();
	p2=polyread();
	mul= mult(p1,p2);
	ad=add(p1,p2);
	printpoly(mul);
	printpoly(ad);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值