数据结构实验3:一元多项式的乘法

实现一元多项式的乘法(需要编写可运行程序)要求:
1、通过键盘随机输入两个多项式P(x)和Q(x)的内容。
2、输出结果要有P(x)、Q(x)以及他们的积。
3、输入输出多项式的格式可自行定义。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct NODE{
    int idx;
    int exp;
    struct NODE* next;
};

void QuickSort(struct NODE a[], int left, int right)
{
    //快排,从大到小
    if(left >= right)   return ;
    int i = left, j = right, key = a[left].exp;
    struct NODE tp=a[left];
    while(i < j) {
        while(i < j && key >= a[j].exp) j--;
        a[i] = a[j];
        while(i < j && key <= a[i].exp) i++;
        a[j] = a[i];
    }
    a[i] = tp;
    QuickSort(a, left, i - 1);
    QuickSort(a, i + 1, right);
}
void Attach(int idx,int exp, struct NODE** pRear){
    struct NODE* P;
    P = (struct NODE*)malloc(sizeof(struct NODE*));
    P->exp=exp;
    P->idx=idx;
    P->next=NULL;
    (*pRear)->next=P;
    *pRear = P;
}

struct NODE* build(){
    struct NODE* P;
    struct NODE* Rear;
    struct NODE* t;
    int n,a,b;
    scanf("%d",&n);
    P=(struct NODE*)malloc(sizeof(struct NODE));
    P->next=NULL;
    Rear = P;
    while(n--){
        scanf("%d%d",&a,&b);
        Attach(a,b,&Rear);
    }
    //删除头结点
    t=P;
    P=P->next;
    free(t);
    return P;
}
void mysotr(struct NODE* head){
    //先把链表的内容存放到数组中(时间为O(n)),然后对那个数组进行从大到小排序nlog(n)
    int i=0,len=0;
    struct NODE *p= (struct NODE *) head;
    while(p!=NULL){
        len++;
        p=p->next;
    }
    struct NODE a[len+2];
    p= (struct NODE *) head;
    for(i=0;p!=NULL;p=p->next,i++){
        a[i].idx=p->idx;
        a[i].exp=p->exp;
    }
    QuickSort(a,0,len-1);
    p= (struct NODE *) head;
    for(i=0;p!=NULL;p=p->next,i++){
        p->idx=a[i].idx;
        p->exp=a[i].exp;
    }
}
void myprint(struct NODE* head){

    if (!head) {
        printf("0 0\n");
        return;
    }
    struct NODE *p=head;
    while(p!=NULL){
        if(p!=head) printf(" ");
        printf("%d %d",p->idx,p->exp);
        p = p->next;
    }
    printf("\n");
}
struct NODE* Add(struct NODE* p1,struct NODE* p2){
    struct NODE* PS;
    struct NODE* rear;
    struct NODE* temp;
    int sum=0;
    PS = (struct NODE*) malloc(sizeof(struct NODE));
    PS->next=NULL;
    rear = PS;
    while(p1!=NULL&&p2!=NULL){
        if(p1->exp==p2->exp){
            sum = p1->idx+p2->idx;
            if(sum) Attach(sum,p1->exp,&rear);
            p1 = p1->next;
            p2 = p2->next;
        }else if(p1->exp>p2->exp){
            Attach(p1->idx,p1->exp,&rear);
            p1 = p1->next;
        }else{
            Attach(p2->idx,p2->exp,&rear);
            p2 = p2->next;
        }
    }
    while(p1!=NULL){
        Attach(p1->idx,p1->exp,&rear);
        p1=p1->next;
    }
    while(p2!=NULL){
        Attach(p2->idx,p2->exp,&rear);
        p2=p2->next;
    }
    temp = PS;
    PS = PS->next;
    free(temp);
    return PS;
}
struct NODE* Mult(struct NODE* p1,struct NODE* p2){
    struct NODE* PM;
    struct NODE* rear;
    struct NODE* temp;
    struct NODE* t1=p1;
    struct NODE* t2=p2;

    if(!p1||!p2) return NULL;
    PM = (struct NODE*) malloc(sizeof(struct NODE));
    PM->next=NULL;
    rear = PM;

    while(t2!=NULL){
        if(t1->exp+t2->exp)Attach(t1->idx*t2->idx,t1->exp+t2->exp,&rear);
        t2=t2->next;
    }

    t1=t1->next;
    while(t1!=NULL){
        t2=p2;
        rear=PM;
        while(t2!=NULL){
            int idx=(t1->idx)*(t2->idx),exp=t1->exp+t2->exp;
            while(rear->next!=NULL&&rear->next->exp>exp)
                rear=rear->next;
            if(rear->next && rear->next->exp==exp){
                if(rear->next->idx+idx){
                    rear->next->idx+=idx;
                }else{
                    struct NODE* tt = rear->next;
                    rear->next=tt->next;
                    free(tt);
                }
            }else{ //创建新项
                struct NODE* tt = (struct NODE*) malloc(sizeof (struct NODE));
                tt->exp=exp;tt->idx=idx;
                tt->next=rear->next;
                rear->next=tt;rear=tt;
            }
            t2 = t2->next;
        }
        t1=t1->next;
    }
    temp = PM;
    PM = PM->next;
    free(temp);
    return PM;
}

int main() {
    struct NODE* P1;
    struct NODE* P2;
    P1=build(),P2=build();
    mysotr(P1),mysotr(P2);

    struct NODE* P3;
    struct NODE* P4;
    P3= Add(P1,P2);
    printf("多项式相加的结果是:");
    myprint(P3);

    P4= Mult(P1,P2);
    printf("多项式相乘的结果是:");
    myprint(P4);
    return 0;
}
//4 3 4 -5 2 6 1 -2 0
//3 5 20 -7 4 3 1

//4 -2 0 -5 2 3 4 6 1
//3 3 1 -7 4 5 20
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值