用链表实现两个多元一项式的加和乘

#include <iostream>
#include <cstring> // strcmp
using namespace std;

#define MAXSIZE 20
#define TRUE 1
#define FALSE 0
typedef bool Status;          /* Status是函数的类型,其值是函f数结果状态代码*/

typedef struct {
    int xi;
    int zhi;
}ElemType;

typedef struct Node {
    ElemType data;
    struct Node* next;
}LinkList;

//插入排序
void InsertSort(LinkList*& mylist)
{
    if ((mylist->next == NULL) || (mylist->next->next == NULL))
    {
        return;
    }

    Node* head, * p1, * prep1, * p2, * prep2, * temp;
    head = mylist;
    prep1 = head->next;
    p1 = prep1->next;
    //prep1和p1是否需要手动后移
    bool flag;

    while (p1 != NULL)
    {
        flag = true;
        temp = p1;
        //由于是单向链表,所以只能从头部开始检索
        for (prep2 = head, p2 = prep2->next; p2 != p1; prep2 = prep2->next, p2 = p2->next)
        {
            //发现第一个较大值
            if (p2->data.zhi > p1->data.zhi)
            {
                p1 = p1->next;
                prep1->next = p1;
                prep2->next = temp;
                temp->next = p2;
                flag = false;
                break;
            }
        }
        //手动后移prep1和p1
        if (flag)
        {
            prep1 = prep1->next;
            p1 = p1->next;
        }
    }
}


void DisplayList(LinkList* List)
{
    int flag = 0;
    Node* p = List;
    while (p->next)
    {
        p = p->next;

        if ((p->data).xi == 0)
            continue;
        else if ((p->data).xi != 1)
            if (!flag)                  // 控制第一个多项式若是正号就不输出
                cout << (p->data).xi;
            else
                printf("%+d", (p->data).xi);
        flag++;

        if ((p->data).xi == 1 && (p->data).zhi == 0)
            cout << "1";

        if ((p->data).zhi == 1)
            cout << "x";
        else if ((p->data).zhi != 0 && (p->data).zhi != 1)
            cout << "x^" << (p->data).zhi;
    }
    cout << endl;
}

void InitList(LinkList*& List)
{
    List = new LinkList;
    List->next = NULL;
}


Status ListInsert(LinkList*& List, int position, ElemType e)
{
    if (position <= 0)
        return FALSE;
    LinkList* p = List;
    LinkList* temp;
    int count = 0;
    while (p->next && count < position - 1)
    {
        p = p->next;
        count++;
    }
    if (count != position - 1)
        return FALSE;
    temp = new Node;
    temp->data = e;
    temp->next = p->next;
    p->next = temp;
    return TRUE;
}

int ListLength(LinkList* List)
{
    LinkList* p = List;
    int count = 0;
    while (p->next)
    {
        p = p->next;
        count++;
    }
    return count;
}


/*字符串转成数字*/
int str2int(char* str)
{
    int temp = 0;
    const char* p = str;
    if (str == NULL) return 0;
    if (*str == '-' || *str == '+')
    {
        str++;
    }
    while (*str != 0)
    {
        if (*str < '0' || *str > '9')
        {
            break;
        }
        temp = temp * 10 + (*str - '0');
        str++;
    }
    if (*p == '-')
    {
        temp = -temp;
    }
    return temp;
}

void Simplify(LinkList*& List)
{
    LinkList* p = List->next;
    LinkList* destory;

    while (p != NULL)
    {
        while (p->next != NULL && (p->data).zhi == (p->next->data).zhi)
        {
            (p->data).xi += (p->next->data).xi;
            destory = p->next;
            p->next = p->next->next;
            delete destory;
        }
        p = p->next;
    }
}


void Multi(LinkList *&La, LinkList *&Lb, LinkList *&Lc)
{
    LinkList* pa = La;
    LinkList* pb = Lb;
    ElemType temp;

    while (pa = pa->next)
    {
        pb = Lb;
        while (pb = pb->next)
        {
            temp.xi = (pa->data).xi * (pb->data).xi;
            temp.zhi = (pa->data).zhi + (pb->data).zhi;
            ListInsert(Lc, ListLength(Lc) + 1, temp);
        }
    }
}


void Add(LinkList*& La, LinkList*& Lb, LinkList*& Lc)
{
    LinkList *p;

    Lc->next = La->next;
    p = Lc->next;

    while (p->next)
        p = p->next;

    p->next = Lb->next;

    InsertSort(Lc);
    Simplify(Lc);
}

int main()
{
    LinkList * F, * G;
    InitList(F);InitList(G);
    LinkList* result1, * result2;
    InitList(result1); InitList(result2);
    ElemType e;
    char strxi[20], strzhi[20];

    cout << "请输入第一个多项式(输入'q'结束输入):" << endl;
    cout << "请输入一个系数: ";
    while (scanf("%s", &(strxi)), strcmp(strxi, "q"))
    {
        e.xi = str2int(strxi);
        cout << "请输入一个指数: ";
        scanf("%s", &(strzhi));
        e.zhi = str2int(strzhi);
        ListInsert(F, ListLength(F) + 1, e);
        cout << "请输入一个系数: ";
    }
    cout << "输入的第一个多项式是:F(x) = ";
    InsertSort(F);
    Simplify(F);
    DisplayList(F);

    cout << "请输入第二个多项式(输入'q'结束输入):" << endl;
    cout << "请输入一个系数: ";
    while (scanf("%s", &(strxi)), strcmp(strxi, "q"))
    {
        e.xi = str2int(strxi);
        cout << "请输入一个指数: ";
        scanf("%s", &(strzhi));
        e.zhi = str2int(strzhi);
        ListInsert(G, ListLength(G) + 1, e);
        cout << "请输入一个系数: ";
    }
    cout << "输入的第二个多项式是:G(x) = ";
    InsertSort(G);
    Simplify(G);
    DisplayList(G);

    Multi(F, G, result1);
    InsertSort(result1);
    Simplify(result1);
    cout << "多项式相乘为:";
    DisplayList(result1);

    Add(F, G, result2);
    cout << "多项式相加为:";
    DisplayList(result2);

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值