一元多项式相加

作者: 修夏之夏i | 来源:发表于2018-10-10 23:50 被阅读7次

    PolyAdd.h

    #define _CRT_SECURE_N0_WARNINGS 1
    
    #define Max 20 
    
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct{
        float coef;
        int expn;
    }PolyArray[Max];
    
    typedef struct Poly{
        float coef;//系数
        int expn; //指数
        struct Poly *next;
    }PolyNode;
    
    void CreatPolyList(PolyNode** pList, PolyArray arr, int n)
    {
        PolyNode *cur, *tail;
        *pList = (PolyNode *)malloc(sizeof(PolyNode));//创建一个空的多项式链表
        (*pList)->next = NULL;
        tail =*pList;
        for (int i = 0; i < n; i++)
        {
            cur = (PolyNode*)malloc(sizeof(PolyNode));
            cur->coef = arr[i].coef;
            cur->expn = arr[i].expn;
            cur->next = NULL;
            tail->next = cur;
            tail = tail->next;
        }
    }
    
    //打印多项式
    void PrintPolyList(PolyNode* pList)
    {
        PolyNode *p = pList->next;
        while (p!=NULL)
        {
            printf("%gX^%d",p->coef,p->expn);
            if (p->next!=NULL)
                printf("+");
            p = p->next;
        }
        printf("\n");
        
    }
    
    //多项式链表排序  指数从大到小 插排
    void PolyListSort(PolyNode** head)
    {
        PolyNode *cur= (*head)->next;
        PolyNode *pHead, *tail;
        if (cur->next != NULL)
        {
            tail = cur->next;
            cur->next = NULL;
            cur= tail;
            while (cur != NULL){
                tail= cur->next;
                pHead = *head;
                while (pHead->next != NULL && (pHead->next->expn) > (cur->expn))
                    pHead = pHead->next;
                cur->next = pHead->next;
                pHead->next = cur;
                cur = tail;
            }
        }
    }
    
    
    //多项式相加
    void AddPoly(PolyNode *pHeadA, PolyNode* pHeadB, PolyNode** pHeadC)
    {
        PolyNode* pA = pHeadA->next;
        PolyNode* pB = pHeadB->next;
        PolyNode*cur, *tail_c;
    
        *pHeadC = (PolyNode*)malloc(sizeof(PolyNode));
        tail_c = *pHeadC;
    
        while (pA != NULL&&pB != NULL)
        {
            if (pA->expn > pB->expn)
            {
                cur = (PolyNode*)malloc(sizeof(PolyNode));
                cur->coef = pA->coef;
                cur->expn = pA->expn;
                cur->next = NULL;
    
                tail_c->next = cur;//新结点尾插在c链表上
                tail_c = tail_c->next;
    
                pA = pA->next;
            }
    
            if (pB->expn > pA->expn)
            {
                cur = (PolyNode*)malloc(sizeof(PolyNode));
                cur->coef = pB->coef;
                cur->expn = pB->expn;
                cur->next = NULL;
    
                tail_c->next = cur;//新结点尾插在c链表上
                tail_c = tail_c->next;
    
                pB = pB->next;
            }
    
            else
            {
                cur = (PolyNode*)malloc(sizeof(PolyNode));
                cur->coef = (pA->coef + pB->coef);
                cur->expn = pA->expn;
                cur->next = NULL;
    
                tail_c->next = cur;//新结点尾插在c链表上
                tail_c = tail_c->next;
    
                pA = pA->next;
                pB = pB->next;
            }
        }
    
        //多余结点
        while (pA != NULL&&pB == NULL)
        {
            cur = (PolyNode*)malloc(sizeof(PolyNode));
            cur->coef = pA->coef;
            cur->expn = pA->expn;
            cur->next = NULL;
    
            tail_c->next = cur;//新结点尾插在c链表上
            tail_c = tail_c->next;
    
            pA = pA->next;
        }
    
        while (pA == NULL&&pB != NULL)
        {
            cur = (PolyNode*)malloc(sizeof(PolyNode));
            cur->coef = pB->coef;
            cur->expn = pB->expn;
            cur->next = NULL;
    
            tail_c->next = cur;//新结点尾插在c链表上
            tail_c = tail_c->next;
    
            pB = pB->next;
        }
    }
    

    main.c

    #define _CRT_SECURE_N0_WARNINGS 1
    
    #include "PolyAdd.h"
    
    int main()
    {
        PolyNode *a_Head = NULL; 
        PolyNode *b_Head = NULL; 
        PolyNode *c_Head = NULL;
        PolyArray a = { { 7, 0 }, { 3, 1 }, { 9, 8 }, { 5, 17 } };
        PolyArray b = { { 8, 1 }, { 22, 7 }, { 9, 8 } };
    
        CreatPolyList(&a_Head, a, 4);
        CreatPolyList(&b_Head, b, 3);
    
        printf("原多项式a: ");
        PrintPolyList(a_Head);
        printf("原多项式b: ");
        PrintPolyList(b_Head);
    
        PolyListSort(&a_Head);
        printf("排序后多项式a: ");
        PrintPolyList(a_Head);
        PolyListSort(&b_Head);
        printf("排序后多项式b: ");
        PrintPolyList(b_Head);
    
        AddPoly(a_Head, b_Head, &c_Head);
        printf("相加后多项式c: ");
        PrintPolyList(c_Head);
    
        return 0;
    }
    
    运行结果: 一元多项式相加.png

    相关文章

      网友评论

        本文标题:一元多项式相加

        本文链接:https://www.haomeiwen.com/subject/rakvaftx.html