1. 程式人生 > 實用技巧 >c語言實現多項式求和

c語言實現多項式求和

一元多項式求和(c語言實現)

​ 把任意給定的兩個一元多項式P(x) ,Q(x) 輸入計算機,計算它們的和並輸出計算結果。

#include <stdio.h>
#include <malloc.h>
typedef struct LNode
{
    int coef; // 係數
    int exp;  // 指數
    struct LNode* next;
} LinkNode;

void Create(LinkNode*& head) // 建立多項式
{
    int n, coef, exp;
    LinkNode* index, * node;
    head = (LinkNode*)malloc(sizeof(LinkNode)); // 建立頭節點
    index = head;                                // 輔助指標,使 index 指向最後一個節點,沒次新增加一個節點,index就後移
    printf("請輸入多項式的項數:");
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        printf("請輸入第%d項的係數和指數", i);
        scanf("%d %d", &coef, &exp);
        node = (LinkNode*)malloc(sizeof(LinkNode)); // 建立新的節點
        node->coef = coef;
        node->exp = exp;
        index->next = node; // 將新建立的加入到連結串列中
        index = node;       // index指向新的節點
    }
    index->next = NULL;
}

void Display(LinkNode* L) // 輸出多項式
{
    L = L->next;   // 讓 指向第一個節點
    while (L != NULL)           // 如果 p 不為空(連結串列不為空),則輸出
    {
        printf("%dX^%d", L->coef, L->exp);  // 輸出係數 和 指數 
        if (L->next != NULL)            // 如果 p 的下一個節點不為空,這就輸出一個 + 號(防止多輸出一個 + 號)
        {
            printf("+");
        }
        L = L->next;
    }
    printf("\n");
}

LinkNode* ListAdd(LinkNode* p, LinkNode* q) // 多項式相加
{
    p = p->next;
    q = q->next;
    LinkNode* addL, * index, * node = NULL;     // 用 addL儲存相加後的二項式, index 為輔助指標,node為新節點
    addL = (LinkNode*)malloc(sizeof(LinkNode));
    index = addL;

    while (p != NULL && q != NULL)              // 目的是為了讓兩個多項式為空去比較
    {
        if (p->exp > q->exp)                    // 如果 p 的指數大於 q 的指數就把 p 的該項做為新節點,讓後讓 p 後移一位
        {
            node = (LinkNode*)malloc(sizeof(LinkNode)); 
            node->coef = p->coef;       
            node->exp = p->exp;
            index->next = node;
            index = node;
            p = p->next;
        }
        else if (p->exp == q->exp)          // 如果 p 的指數等於 q 的指數,就把 p 和 q 的係數相加作為新節點,讓後讓 p 和 q 後移一位
        {
            node = (LinkNode*)malloc(sizeof(LinkNode));
            node->coef = p->coef + q->coef;
            node->exp = p->exp;
            if (node->coef == 0)
            {
                free(node);
            }
            else
            {
                index->next = node;
                index = node;
            }
            p = p->next;
            q = q->next;
        }
        else                          // 如果 q 的指數大於 p 的指數就把 q 的該項做為新節點,讓後讓 q 後移一位
        {
            node = (LinkNode*)malloc(sizeof(LinkNode));
            node->coef = q->coef;
            node->exp = q->exp;
            index->next = node;
            index = node;
            q = q->next;
        }
    }
    if (p != NULL)          // 如果 p 不為空,說明 q 為空了,就可以直接將 p 後面的節點給 node
    {
        node->next = p->next;
    }
    else if (q != NULL)     // 如果 q 不為空,說明 p 為空了,就可以直接將 q 後面的節點給 node
    {
        node->next = q->next;
    }
    else                    // 如果執行這個則所民 p 和 q 都為空了,就讓node指向的最後的節點指向空
    {
        node->next = NULL;
    }
    return addL;
}
int main(int argc, char const* argv[])
{
    LinkNode* P, * Q;
    printf("請輸入第一個多項式");
    Create(P);
    Display(P);
    printf("請輸入第二個多項式");
    Create(Q);
    Display(Q);
    LinkNode* List = ListAdd(P, Q);
    printf("相加後的多項式為:");
    Display(List);
    return 0;
}