應用實例-多項式加法運算

1、引言

主要思路:相同指數的項係數相加,其他部分進行拷貝。算法

2、多項式加法運算

採用不帶頭結點的單向鏈表,按照指數遞減的順序排列各項。app

/* c語言實現 */

strct PolyNode{
  int coef;  // 係數
  int expon;  // 指數
  struct PolyNode *link; // 指向下一個結點的指針
};
typedef struct PolyNode *Polynomial;
Polynomial P1, P2;

2.1 算法思路

兩個指針P1和P2分別指向這兩個多項式第一個結點,不斷循環:函數

  • P1->expon == P2->expon:係數相加,若結果不爲0,則做爲結果多項式對應項的係數。同時,P1和P2都分別指向下一項;
  • P1->expon > P2->expon:將P1的當前項存入結果多項式,並使P1指向下一項;spa

  • P1->expon < P2->expon:將P2的當前項存入結果多項式,並使P2指向下一項;指針

當某一多項式處理完時,將另外一個多項式的全部結點依次複製到結果多項式中去。code

/* c語言實現 */

Polynomial PolyAdd(Polynomial P1, Polynomian P2)
{
  Polynomial front, rear, temp;
  int sum;
  rear = (Polynomial)malloc(sizeof(struct PolyNode)); // 爲方便表頭插入,先產生一個臨時空節點做爲結果多項式鏈表頭
  front = rear; // 由front記錄結果多項式鏈表頭結點
  while (P1 && P2) // 當兩個多項式都有非零項待處理時
    switch(Compare(P1->expon, P2->expon)){
        case1: // P1中的數據項指數較大
            Attach(P1->coef, P1->expon, &rear);
            P1 = P1->link;
            break;
        case-1: // P2中的數據項指數較大
            Attach(P2->coef, P2->expon, &rear);
            P2 = P2->link;
            break;
            case 0: // 兩項數據項指數相等
            sum = P1->coef + P2->coef;
            if (sum) Attach(sum, P1->expon, &rear); // 判斷係數和是否爲0
            P1 = P1->link;
            P2 = P2->link;
            break;  
    }
  // 講未處理完的另外一個多項式的全部節點一次複製到結果多項式中去
  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; // 令front指向結果多項式第一個非零項
  free(temp); // 釋放臨時空表頭結點
  return front;
}
/* c語言實現 */

void Attach(int c, int e, Polynomial *pRear)
{
  /* 因爲在本函數中須要改變當前結果表達式尾項指針的值,
  因此由函數傳遞進來的是結點指針的地址,*pRear指向尾項 */
  Polynomial P;
  
  P = (Polynomial)malloc(siezeof(struct PolyNode)); // 申請新結點
  P->coef = c; // 對新結點賦值
  P->expon = e;
  P-Llink = NULL;
  // 將P指向的新結點插入到當前結果表達式尾項的後面
  (*pRear)->link=P;
   *pRear = P; // 修改pRear值
}
def adds(l1, l2):  # l1,l2爲鏈表,且不爲空
    p1 = l1.head
    p2 = l2.head
    addRes = []
    while (p1 is not None) and (p2 is not None):  # 當p1和p2都部位空時,進行運算
        tmp1_exp = p1.get_data()[1]  # 獲取p1指針處節點的指數
        tmp2_exp = p2.get_data()[1]  # 獲取p2指針處節點的指數

        # 當指數相同時,係數相加,指數不變
        if tmp1_exp == tmp2_exp:
            addRes.append([p1.get_data()[0] + p2.get_data()[0], p1.get_data()[1]])
            p1 = p1.next  # 指針指向下一個節點
            p2 = p2.next

        # 當指數不相同時,選擇較大的指數項存到結果中
        if tmp1_exp > tmp2_exp:
            addRes.append([p1.get_data()[0], p1.get_data()[1]])
            p1 = p1.next
        if tmp1_exp < tmp2_exp:
            addRes.append([p2.get_data()[0], p2.get_data()[1]])
            p2 = p2.next

    # 對於鏈表中剩餘的節點添加到結果中
    while p1 is not None:
        addRes.append([p1.get_data()[0], p1.get_data()[1]])
        p1 = p1.next
    while p2 is not None:
        addRes.append([p2.get_data()[0], p2.get_data()[1]])
        p2 = p2.next

    # 此時的addRes結果
    # addRes [[5, 20], [-4, 4], [-5, 2], [9, 1], [-2, 0]]
    # 列表中每一項表明一各指數項,其中第一個元素表明係數,第二個元素表明指數。如[5,20]:5x^20

    # 如下是對addRes進行變形處理
    res1 = []
    for item in addRes:
        if item[0] != 0:  # 若是指數爲0,即存在抵消狀況,此時不該該輸出
            res1.append(item[0])
            res1.append(item[1])
    if len(res1) == 0:  # 若是結果爲0,須要輸出:0  0
        return [0, 0]

    # 此時的輸出結果變爲
    # [5,20,-4,4,-5,2,9,1,-2,0]
    return res1
相關文章
相關標籤/搜索