一元多项式的加减,链表

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

typedef struct PolyNode
{
    int coef;  //数据域
    int exp;
    struct PolyNode* next;  //指针域
}node;

node* CreatePoly(void)
{
    node* h, * tail, * s;    //定义:头节点,尾节点,一般节点
    int coef, exp;   //系数,指数

    h = (node*)malloc(sizeof(node));    //分配地址
    if (!h)  //h为0,(链表的检测)
    {
        exit(-1);    
    }
    h->next = NULL;    //链表清空 
    tail = h;

    printf("请输入每一项额系数和指数(中间以逗号隔开):\n");
    printf(" coef, exp");//
    scanf_s("%d,%d", &coef, &exp);
    while (coef)
    {
        s = (node*)malloc(sizeof(node));  //分配地址
        if (!s)  //s为空
        {
            exit(-1);
        }
        s->coef = coef;  //将数存到结构体的coef中
        s->exp = exp;

        s->next = tail->next;
        tail->next = s;
        tail = s;   //创建链表

        printf("coef, exp ");//
        scanf_s("%d,%d", &coef, &exp); //每次输入系数,直至系数为0
    }

    return h;  //单向链表都要返回头结点
}

void PolyAdd(node* polya, node* polyb)
{
    node* p, * q, * pre, * temp;
    int sum = 0;

    p = polya->next;  //利用指针域,进行while循环    ,f(x1)
    q = polyb->next;    //f(x2)
    pre = polya;  //把第一个多项式赋值给pre

    while (p && q)   //链表未到尾结点
    {
        if (p->exp < q->exp)   //结点成员比较大小
        {
            pre->next = p;  //将p赋给pre
            pre = p;
            p = p->next; //p的下一个结点给p
        }
        else if (p->exp > q->exp)
        {
            pre->next = q;
            pre = q;
            q = q->next;  //同上
        }
        else
        {
            sum = p->coef + q->coef;
            if (sum)
            {
                p->coef = sum;   //对结点成员进行赋值
                pre->next = p;  
                pre = p;
                p = p->next;

                temp = q->next;//只把q的指针域赋给q,确保可以输入负系数
                q = temp;
            }
            else
            {
                temp = p->next;                 
                p = temp;

                temp = q->next;                
                q = temp;
            }
        }
    }

    pre->next = p ? p : q;
}
void PolyAds(node* polya, node* polyb)  //同上,算减法
{
    node* p, * q, * pre, * temp;
    int sum = 0;;

    p = polya->next;
    q = polyb->next;
    pre = polya;

    while (p && q)
    {
        if (p->exp < q->exp)
        {
            pre->next = p;
            pre = p;
            p = p->next;
        }
        else if (p->exp > q->exp)
        {
            pre->next = q;
            pre = q;
            q = q->next;
        }
        else
        {
            sum = p->coef - q->coef;
            if (sum)
            {
                p->coef = sum;
                pre->next = p;
                pre = p;
                p = p->next;

                temp = q->next;
                free(q);
                q = temp;
            }
            else
            {
                temp = p->next;
                free(p);
                p = temp;

                temp = q->next;
                free(q);
                q = temp;
            }
        }
    }

    pre->next = p ? p : q;
}


int Prin(node* h)
{
    node* p = h->next; 

    while (p)
    {
        printf("%d*x^%d  ", p->coef, p->exp);
        p = p->next; //帮助输出整个链表
    }
    printf("\n");

    return 1;
}

int main(void)
{
    node* polya, * polyb;
    int a;  //运算符不能作为变量传递

    printf("请输入第一个一元多项式的系数和指数(假定以输入系数为0来结束):\n");
    polya = CreatePoly();
    printf("请输入的第一个一元多项式为:\n");
    Prin(polya);

    printf("请输入第二个一元多项式的系数和指数(假定以输入系数为0来结束):\n");
    polyb = CreatePoly();
    printf("请输入的第二个一元多项式为:\n");
    Prin(polyb);

    printf("请输入1为+或2为-\n");
    scanf_s("%d", &a);

    if (a ==1 )
    {
        printf("这两个一元多项式相加后的结果为:\n");
        PolyAdd(polya, polyb),
            Prin(polya);
    }
    else
    {
        printf("这两个一元多项式相减后的结果为:\n"),
            PolyAds(polya, polyb),
            Prin(polya);
    }

    system("pause");
    return 1;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值