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

这里写图片描述


#define _CRT_SECURE_NO_DEPRECATE


#include <stdio.h>  
#include <malloc.h>  
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>

typedef struct PolyNode * Polynomial;//指向结构体头结点的指针

struct PolyNode
{
    int coef;//系数
    int expon;//指数
    Polynomial link;//链表的指针域,指向下一个节点
};
//函数声明
Polynomial ReadPoly();
void Attach(int c, int e, Polynomial * pRear);
Polynomial Add(Polynomial P1, Polynomial P2);
Polynomial Mult(Polynomial P1, Polynomial P2);
void PrintPoly(Polynomial P);


int main()
{
    Polynomial P1, P2, PP, PS;

    P1 = ReadPoly();//读入多项式,P1是链表结构体的指针
    P2 = ReadPoly();
    PP = Mult(P1, P2);
    PrintPoly(PP);//把链表的头结点的头指针作为参数
    printf("\n");
    PS =Add(P1, P2);//返回新的多项式节点的指针
    PrintPoly(PS);

    return 0;
}

void Attach(int c, int e, Polynomial * pRear)//传入Polynomial类型的指针,Polynomial本身就是指针。pRear也就是指针的指针;pRear是一个定义好的值,attach需要修改它的值,所以要传它的指针
//C语言中函数参数传递要改变参数值应采用传地址方式
{
    Polynomial P;
    //P单独一块存有c,e
    P = (Polynomial)malloc(sizeof(struct PolyNode));
    P->coef = c;
    P->expon = e;
    P->link = NULL;
    //把新申请的P放在(*pRear)指针后面,(*pRear)指向当前结果表达式尾项
    (*pRear)->link= P;
    *pRear = P;//*pRear指向跟P指向的同一块内存
}

Polynomial ReadPoly()
{
    Polynomial P, Rear, t;
    int c, e, N;
    scanf("%d",&N);//读几个数
    P = (Polynomial)malloc(sizeof(struct PolyNode));//链表头空节点

    P->link= NULL;
    Rear = P;//Rear指向目前链表结果多项式的最后一项

    while (N--)//读入系数和指数
    {
        scanf("%d %d",&c,&e);
        if (c != 0)
        {
            Attach(c, e, &Rear);//构造一个节点,把这个节点插到多项式尾部
        }
    }
    //删除临时生成的头结点
    t = P;
    P = P->link;//P指向第一个有效非空的节点
    free(t);
    return P;
}

Polynomial Add(Polynomial P1, Polynomial P2)
{
    Polynomial t1,t2,P,Rear,t;
    t1 = P1; t2 = P2;//t1,t2指向这两个多项式
    //生成新的头结点

    P = (Polynomial)malloc(sizeof(struct PolyNode));
    P->link = NULL;

    Rear = P;
    while (t1&&t2)/*当t1,t2都不空的时候,比较当前t1,t2的指数*/
    {
        if (t1->expon == t2->expon)
        {
            if (t1->coef + t2->coef)//系数和为0不添加在尾节点上
            {
                Attach(t1->coef + t2->coef, t1->expon, &Rear);
            }
            t1 = t1->link;
            t2 = t2->link;
        }
        else
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值