链表的应用之多项式求和

  一元多项式的运算包括加法减法和乘法,而多项式的加法和乘法都可以依靠多项式的加法来实现,所以本文仅仅讲解如何用链表实现一元多项式的加法。

  数学上的一元多项式的表示是p(x) = p0 + p1 * x + p2 * x^2 + p3 * x^3 + … + pn * x^n;
  用链表来表示就是p = (p0, p1, p2, … , pn);

  所谓的多项式相加就是同类项的合并,也就是两条链表的合并。
  采用单链表保存多项式,链表的每个结点表示多项式的每一非零项,链表应该按有序排列。

1、链表结构:

  数据域中用两个数分别表示系数和阶数。

typedef struct Node
{
    int coef,exp;
    Node *next; 
}*LinkList;

2、创建链表:

LinkList creat_link(const vector<int> &vec)
{
    LinkList head, newnode, ptr;
    const int s = vec.size();
    for (int i = 0; i < s; ++i)
    {
        newnode = new Node;
        //判断新节点是否申请成功
        if (!newnode)
        {
            cout<<"Error!! 内存分配失败!!"<<endl;
            exit(1);        
        }
        if (i == 0)
        {
            newnode->coef = vec[i];//系数
            newnode->exp = s - i - 1;//阶数
            newnode->next = nullptr;
            head = newnode;
            ptr = head;
        }
        //尾插法
        else if (vec[i] != 0)
        {
            newnode->coef = vec[i];//系数
            newnode->exp = s - i - 1;//阶数
            newnode->next = nullptr;
            ptr->next = newnode;
            ptr = newnode;
        }
    }
    return head;
}

3、定义链表的加法运算:

LinkList add_link(LinkList a, LinkList b)
{
    vector<int> vec;
    if (a != nullptr)
    {
        while(b != nullptr)
        {
            if (a->exp == b->exp)//阶数相同
            {
                vec.push_back(a->coef + b->coef);
                a = a->next;
                b = b->next;
            }
            else if (a->exp > b->exp)//阶数高
            {
                vec.push_back(a->coef);//压入阶数高的
                a = a->next;
            }
            else if (a->exp < b->exp)//阶数低
            {
                vec.push_back(b->coef);
                b = b->next;
            }
        }
    }
    return creat_link(vec);
} 

4、打印链表:

void print_link(LinkList head)
{
    while (head != nullptr)
    {
        if(head->exp == 1 && head->coef != 0)//阶数为1
        {
            cout << head->coef << "X + "; 
        }
        else if (head->exp != 0 && head->coef != 0)//阶数为常数
        {
            cout<< head->coef << "X^" << head->exp << " + ";
        }
        else if (head->coef != 0)//阶数为0
        {
            cout<< head->coef;
        }
        head = head->next;
    }
    cout << endl;
}
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用链表实现一元多项式求和的代码,需要输入多项式项数和各项系数和指数。 #include<stdio.h> #include<stdlib.h> struct PolyNode{ int coef;//系数 int expon;//指数 struct PolyNode *link;//链指针 }; typedef struct PolyNode *Polynomial; Polynomial readPoly();//读取多项式 void attach(int c, int e, Polynomial *pRear);//新建节点 Polynomial add(Polynomial p1, Polynomial p2);//多项式加法 void printPoly(Polynomial P);//输出多项式 int main(){ Polynomial P1, P2, PP; P1 = readPoly(); P2 = readPoly(); PP = add(P1, P2); printPoly(PP); return 0; } Polynomial readPoly(){ Polynomial P, Rear, t; int c, e, N; scanf("%d", &N); P = (Polynomial)malloc(sizeof(struct PolyNode));//头节点 P->link = NULL; Rear = P; while(N--){ scanf("%d %d", &c, &e); attach(c, e, &Rear);//在Rear之后插入一个节点 } t = P; P = P->link; free(t);//释放头节点 return P; } void attach(int c, int e, Polynomial *pRear){ Polynomial P; P = (Polynomial)malloc(sizeof(struct PolyNode)); P->coef = c; P->expon = e; P->link = NULL; (*pRear)->link = P; *pRear = P; } Polynomial add(Polynomial p1, Polynomial p2){ Polynomial front, rear, temp; int sum; rear = (Polynomial)malloc(sizeof(struct PolyNode)); front = rear; while(p1 && p2){ if(p1->expon > p2->expon){ attach(p1->coef, p1->expon, &rear); p1 = p1->link; } else if(p1->expon < p2->expon){ attach(p2->coef, p2->expon, &rear); p2 = p2->link; } else{ sum = p1->coef + p2->coef; if(sum) attach(sum, p1->expon, &rear); p1 = p1->link; p2 = p2->link; } } for(; p1; p1 = p1->link) attach(p1->coef, p1->expon, &rear); for(; p2; p2 = p2->link) attach(p2->coef, p2->expon, &rear); rear->link = NULL; temp = front; front = front->link; free(temp);//释放头节点 return front; } void printPoly(Polynomial P){ int flag = 0; if(!P){ printf("0 0\n"); return; } while(P){ if(!flag) flag = 1; else printf(" "); printf("%d %d", P->coef, P->expon); P = P->link; } printf("\n"); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~青萍之末~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值