链表的应用之多项式求和

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

  数学上的一元多项式的表示是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;
}

猜你喜欢

转载自blog.csdn.net/daaikuaichuan/article/details/80314690