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

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

 

  • 时间限制:200ms
  • 内存限制:64MB
  • 代码长度限制:16kB
  • 判题程序:系统默认
  • 作者:DS课程组
  • 单位:浙江大学

 

题目判定

解题程序

多项式相乘可以看成多项式多次相加,所以重点在于怎么写相加函数。感觉就是单链表合并的升级罢了。认真点还是能写出来的.

 

 

数据结构的题真心不好写,感情没希望拿证书了。唉....

还是菜,这道题Debug了一个星期了,国庆长假,兼职一天,累趴了,容我缓缓。。。。

还是在机房码代码更爽....

 

不BB了 看码吧:

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

typedef int ElemType;
typedef struct node *ptrNode;
typedef ptrNode LinkList;  ///头结点指针
typedef ptrNode Position;  ///中间结点指针
struct node
{
    ElemType Coefficient;  ///系数
    ElemType Exponent; ///指数
    Position next;  ///指向下一个结点的指针
};

LinkList creatList(int n)  ///构造函数
{
    LinkList head;
    Position rear, p;
    ElemType coe,exp;
    head=(struct node*)malloc(sizeof(struct node));
    rear=head;
    while(n--)
    {
        scanf("%d%d",&coe,&exp);
        p=(struct node*)malloc(sizeof(struct node));
        p->Coefficient=coe;
        p->Exponent=exp;
        rear->next=p;
        rear=p;
    }
    rear->next=NULL;
    return head;
}

LinkList Add_List(LinkList a,LinkList b)  ///多项式相加;
{
    LinkList ha,hb,hc;
    Position rear,ptr;
    ElemType temp;

    ha=a->next;
    hb=b->next;
    hc=(struct node*)malloc(sizeof(struct node));
    rear=hc;
    while((ha!=NULL)&&(hb!=NULL))
    {
        ptr=(struct node*)malloc(sizeof(struct node));
        if(ha->Exponent > hb->Exponent)
        {
            ptr->Exponent = ha->Exponent;
            ptr->Coefficient = ha->Coefficient;
            ha = ha->next;
            rear->next = ptr;
            rear = ptr;
        }
        else if(ha->Exponent < hb->Exponent)
        {
            ptr->Exponent = hb->Exponent;
            ptr->Coefficient = hb->Coefficient;
            hb = hb->next;
            rear->next = ptr;
            rear = ptr;
        }
        else   ///指数相同时。
        {
            temp = ha->Coefficient + hb->Coefficient;   ///用temp存系数和
            if(temp != 0)
            {
                ptr->Exponent = ha->Exponent;
                ptr->Coefficient = temp;
                rear->next = ptr;
                rear = ptr;
            }
            ha=ha->next;  ///ha,hb,均向后移。
            hb=hb->next;
        }
    }
    if(ha==NULL)
    {
        while(hb!=NULL)
        {
            ptr = (struct node*)malloc(sizeof(struct node));
            ptr->Exponent = hb->Exponent;
            ptr->Coefficient = hb->Coefficient;
            hb=hb->next;
            rear->next=ptr;
            rear=ptr;
        }
    }
    if(hb==NULL)
    {
        while(ha!=NULL)
        {
            ptr = (struct node*)malloc(sizeof(struct node));
            ptr->Exponent = ha->Exponent;
            ptr->Coefficient = ha->Coefficient;
            ha=ha->next;
            rear->next=ptr;
            rear=ptr;
        }
    }
    rear->next=NULL;
    return hc;
}

LinkList Mul_List(LinkList a,LinkList b)   ///多项式相乘,利用到多次相加函数即可
{
    LinkList ha,hb,hc;
    Position rear,ptr,c;
    ha=a->next;
    hb=b->next;
    hc=creatList(0);
    if(ha==NULL || hb==NULL)
    {
        return hc;
    }

    while(ha!=NULL)
    {
        c=(struct node*)malloc(sizeof(struct node));
        rear = c;
        hb=b->next;
        while(hb!=NULL)
        {
            ptr=(struct node*)malloc(sizeof(struct node));
            ptr->Exponent=ha->Exponent + hb->Exponent;
            ptr->Coefficient=ha->Coefficient*hb->Coefficient;
            hb=hb->next;
            rear->next=ptr;
            rear=ptr;
        }
        rear->next=NULL;
        hc=Add_List(hc,c);
        ha=ha->next;
    }
    return hc;
}

void printList(LinkList L)
{
    LinkList hc;
    int f=0;
    hc=L->next;
    if(hc==NULL)   ///如题,为空输出0.
    {
        printf("0 0");
    }
    while(hc!=NULL)
    {
        if(f)
            printf(" ");
        else
            f=1;
        printf("%d %d",hc->Coefficient,hc->Exponent);
        hc=hc->next;
    }
     printf("\n");
}

int main()
{
    int n1,n2;
    LinkList L1,L2,L3,L4;
    scanf("%d",&n1);
    L1=creatList(n1);
    scanf("%d",&n2);
    L2=creatList(n2);

    L3=Add_List(L1,L2);
    L4=Mul_List(L1,L2);

    printList(L4);
    printList(L3);
    return 0;
}

 

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页