浙大PAT:一元多项式的加法与乘法

PAT:一元多项式的加法与乘法

#include <stdio.h>
#include <stdlib.h>

typedef struct Node{
    int xs;
    int zs;
    struct Node* next;
}Node,*List;

void Init(List *L){
    *L = (List)malloc(sizeof(Node));
    (*L)->xs = 0;
    (*L)->zs = 0;
    (*L)->next = NULL;
}
void Read(List L){
    int n;
    scanf("%d",&n);
    while(n--){
        Node* N = (Node*)malloc(sizeof(Node));
        scanf("%d %d",&N->xs,&N->zs);
        N->next = NULL;
        L->next = N;
        L = L->next;
    }
}

void PrintfList(List L){
    L = L->next;
    if(L==NULL){
    	printf("0 0");
    	return;
	}
    printf("%d %d",L->xs,L->zs);
    L = L->next;
    while(L){
        printf(" %d %d",L->xs,L->zs);
        L = L->next;
    }
}

void copy(List L1,List L2){     //拷贝一份L1给L2
    Node* p1 = L1->next;
    Node* pL = L2;
    while(p1){  
        Node* N = (Node*)malloc(sizeof(Node));
        N->xs = p1->xs;
        N->zs = p1->zs;
        N->next = NULL;
        pL->next = N;
        pL = pL->next;
        p1 = p1->next;
    }
    pL->next = NULL;
}

List SUM(List L1,List L2){		//将L2加到L1上 
    List L3 = L1;
    Node* N;
    Node* p1 = L1->next;
    Node* p2 = L2->next;
    L3->next = NULL;
    N = L3;
    while(p1&&p2){
        if(p1->zs>p2->zs){
            N->next = p1;
            p1 = p1->next;
            N = N->next;
            N->next = NULL;
        }else if(p1->zs<p2->zs){
        	Node* p = (Node*)malloc(sizeof(Node));		//复制当前p2结点 
        	p->xs = p2->xs;
        	p->zs = p2->zs;
        	p->next = NULL; 
        	
            N->next = p;
            p2 = p2->next;
            N = N->next;
        }
        else{
            p1->xs += p2->xs;
            if(p1->xs!=0){
            	N->next = p1;
            	N = N->next;
			}
			p1 = p1->next;
			p2 = p2->next;
			N->next = NULL;
        }
    }
    if(p1)  N->next = p1;
    else if(p2){
    	Node* p = (Node*)malloc(sizeof(Node));		//复制当前p2结点 
        	p->xs = p2->xs;
        	p->zs = p2->zs;
        	p->next = NULL;
        	
            N->next = p;
            N = N->next;
            
            copy(p2,N);
	} 
    return L3;
}

List MUL(List L1,List L2){

    List sum;
    Init(&sum);

    Node* p1 = L1->next;
    Node* p2 = L2->next;

    List L3;
    Init(&L3);

    copy(L1,L3);
    Node* p3 = L3->next;

    if(p1==NULL||p2==NULL)  return sum;

    while(p2){
        while(p1){
            p3->xs = p1->xs*p2->xs;
            p3->zs = p1->zs+p2->zs;
            p1 = p1->next;
            p3 = p3->next;
        }
        p3 = L3->next;
        p1 = L1->next;
        sum = SUM(sum,L3);
        p2 = p2->next;
    }

    return sum;
}

int main(){
	freopen("1.txt","r",stdin);
    List L1,L2,sum,mul;
    
    Init(&L1);
    Init(&L2);
    Init(&sum);
    Init(&mul);
    
    Read(L1);
    Read(L2);
    copy(L1,sum);
    
    sum = SUM(sum,L2);
    mul = MUL(L1,L2);
    
    PrintfList(mul);
    printf("\n");
    PrintfList(sum);
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值