一元多項式的運算

来源:http://www.cnblogs.com/520xiuge/archive/2016/02/03/5180545.html
-Advertisement-
Play Games

以一元多項式加法運算為例: A,B可用線性鏈表可以表示為: “和多項式”鏈表如下(圖中的長方框表示已經被釋放的結點): #include <stdio.h> #include <stdlib.h> typedef struct Polyn{ int data; int index; struct P


以一元多項式加法運算為例:

A,B可用線性鏈表可以表示為:

“和多項式”鏈表如下(圖中的長方框表示已經被釋放的結點):

#include <stdio.h>
#include <stdlib.h>
typedef struct Polyn{
    int data;
    int index;
    struct Polyn *next;
}Polyn,*Polynlist;
void CreatPolyn(Polynlist &p,int m)//輸入m項的繫數和指數,建立一元多項式P
{    
    //有頭結點
    Polyn *q=p;
    for(int i=0;i<m;i++)
    {
        q->next=(Polyn*)malloc(sizeof(Polyn));
        q=q->next;
//        printf("第%d項繫數、指數:",i+1);
        scanf("%d%d",&q->data,&q->index);
    }
    q->next=0;
}
void PrintPolyn(Polynlist &p)//列印一元多項式P
{
    Polyn *q=p->next;
    //(x^0)和(x^1)要做特別處理
    if(q->index == 0)                                                                                    
    {
        printf("%d",q->data);
        //可能第二項指數為x
        q=q->next;
        if(q && q->index == 1)
        {
            if(q->data != 1)
                printf("%+dx",q->data);//正數則在前面加+,否則不加
            else
                printf("+x");
            q = q->next;
        }
    }
    else if(q->index == 1){
        if(q->data != 1)
            printf("%dx",q->data);
        else
            printf("x");
        q = q->next;
    }
    else{
        printf("%dx^%d",q->data,q->index);
        q = q->next;
    }
    while(q)
    {
        printf("%+dx^%d",q->data,q->index);
        q=q->next;
    }
    printf("\n");
}
void CopyPolyn(Polynlist &q,Polyn *r)//空指針必須引用去創建,新開闢結點鏈表並複製(數據域和指針域)
{
    q = (Polyn *)malloc(sizeof(Polyn));
    Polyn *q1 = q,*r1 = r->next;
    while(r1)
    {
        q1->next = (Polyn *)malloc(sizeof(Polyn));
        q1 = q1->next;
        q1->data = r1->data;
        q1->index = r1->index;
        r1 = r1->next;
    }
    q1->next = NULL;
}
void ShowMenu()
{
    printf("\t\t\t1.多項式相加\n");
    printf("\t\t\t2.多項式相減\n");
    printf("\t\t\t3.多項式相乘\n");
    printf("\t\t\t4.退出\n");
}
void AddPolyn(Polyn *p,Polyn *p1)//完成多項式相加運算,p=p+p1,並銷毀p1
{
    Polyn *qa,*qb,*prior,*r;//設置prior是為B鏈表中的結點插入A鏈表用
    prior = p;
    qa = p->next;
    qb = p1->next;
    while(qa && qb)
    {
        if(qa->index < qb->index)
        {
            prior = qa;
            qa = qa->next;
        }
        else if(qa->index > qb->index){
            r = qb;
            qb = qb->next;
            //摘取qb到“和多項式”鏈表中
            r->next = qa;
            prior->next = r;
            //更新prior
            prior = r;
        }
        else{
            if(qa->data + qb->data != 0)
            {
                //修改qa所指結點的繫數值,同時釋放qb所指的結點
                qa->data = qa->data + qb->data;
                r = qb;
                qb = qb->next;
                free(r);
            }
            else{
                //釋放指針qa和qb所指的結點
                r = qa;
                qa = qa->next;
                prior->next = qa;//銜接
                free(r);
                r = qb;
                qb = qb->next;
                free(r);
            }
        }
    }
    //B鏈表還有結點
    if(qb)
    {
        prior->next = qb;//此時qa已為空指針
    }
    free(p1);//釋放B頭結點
}
void reverse(Polyn *p)
{
    Polyn *q = p->next;
    while(q)
    {
        q->data = -(q->data);
        q = q->next;
    }
}
void DestroyPolyn(Polyn *r)
{
    Polyn *q;
    do{
        q = r;
        r = r->next;
        free(q);
    }while(r);
}
void AdjustPolyn(Polyn *r,int data,int index)//調整每一項
{
    Polyn *q = r->next;
    while(q)
    {
        q->data *= data;
        q->index += index;
        q = q->next;
    }
}
void SubtractPolyn(Polynlist &p,Polynlist &p1)//完成多項式相減運算,p=p-p1,並銷毀p1
{
    reverse(p1);//將B鏈表的data域置反
    AddPolyn(p,p1);
}
void MultiplyPolyn(Polynlist &p,Polyn *p1)//完成多項式相乘運算,p=p*p1,並銷毀p1
{
    Polyn *q,*r = NULL,*r1 = NULL;
    q = p1->next;
    //A(x)--》bi*A(x)*x^ei
    CopyPolyn(r,p);
    AdjustPolyn(r,q->data,q->index);
    q = q->next;
    while(q)
    {
        CopyPolyn(r1,p);
        AdjustPolyn(r1,q->data,q->index);
        AddPolyn(r,r1);//r1將被銷毀
        r1 = NULL;//必須將r1置空
        q = q->next;
    }
    //r-->p,同時釋放r鏈表
    DestroyPolyn(p);
    p = NULL;
    CopyPolyn(p,r);
    DestroyPolyn(r);
}
int main()
{
    int m;
    Polyn *p=(Polyn*)malloc(sizeof(Polyn));
    Polyn *p1=(Polyn*)malloc(sizeof(Polyn));
    Polyn *p2 = NULL,*p3 = NULL;
    printf("按升冪輸入多項式A(x),B(x)的繫數,指數\n");
    printf("A(x)的項數:");
    scanf("%d",&m);
    CreatPolyn(p,m);
    printf("A(x)=");
    PrintPolyn(p);
    printf("B(x)的項數:");
    scanf("%d",&m);
    CreatPolyn(p1,m);
    printf("B(x)=");
    PrintPolyn(p1);
    //保存A,B原始多項式,此處的複製是新開闢結點鏈表
    CopyPolyn(p2,p);
    CopyPolyn(p3,p1);
    system("pause");
    system("cls");
    printf("A(x)=");
    PrintPolyn(p);
    printf("B(x)=");
    PrintPolyn(p1);
    printf("選擇以下一種操作方式:\n");
    ShowMenu();
    do{
        printf("請輸入你的選擇:");
        scanf("%d",&m);
        switch(m)
        {
        case 1:
            AddPolyn(p,p1);
            printf("A(x)+B(x)=");
            PrintPolyn(p);
            break;
        case 2:
            SubtractPolyn(p,p1);
            printf("A(x)-B(x)=");
            PrintPolyn(p);
            break;
        case 3:
            MultiplyPolyn(p,p1);
            printf("A(x)*B(x)=");
            PrintPolyn(p);
            break;
        default:
            exit(0);
        }
        fflush(stdin);
        DestroyPolyn(p);
        p1 = p = NULL;//此時的p、p1為游離指針,必須要置空
        CopyPolyn(p,p2);
        CopyPolyn(p1,p3);
    }while(1);
    return 0;
}

 運行結果截圖:

按Enter鍵之後


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 直接用set就行,比如: l = [1, 1, 2, 2, 3, 4, 5] s = set(l) c = [i for i in s] print c 結果為: [1, 2, 3, 4, 5] 其中第三行利用了python的列表生成式
  • 外部腳本 在這個認證模塊中,當ejabberd啟動,它將啟動一個腳本去調用它的認證任務. 服務管理員可以使用任何的變成語言去編寫外部腳本,ejabberd與腳本之間的介面詳情的描述在ejabberd開髮指南中. 這裡也有一些認證腳本的實例. 鏈接:https://www.ejabberd.im/ex
  • 在JDK1.0中,Date類是唯一的一個代表時間的類,但是由於Date類不便於實現國際化,所以從JDK1.1版本開始,推薦使用Calendar類進行時間和日期處理。 一、這裡簡單介紹一下Date類的使用。 1、使用Date類代表當前系統時間 Date d = new Date(); System.o
  • Widget Factory 題意:有n件裝飾品,有m組信息。(1 <= n ,m<= 300)每組信息有開始的星期和結束的星期(是在mod 7範圍內的)並且還包括num種裝飾品的種類(1~n),其中每種裝飾品所用的時間3 <= x[i] <= 9;種類的輸入可以重覆; 思路: 1.根據輸入建立增廣
  • Boss說,我們買了個權威證書,不如做全站式的https吧,讓用戶打開主頁就能看到受信任的綠標。於是我們就開始了填坑之旅。 【只上主域好不好?】 不好。。。console會報出一大堆warning因為圖片域沒有https~瀏覽器證書符號也不是綠色的~ 【在哪裡解密SSL?】 大網站都是架構複雜的啦~
  • 一、前言 本篇文章需要讀者有一點 Node.js 基礎的瞭解,並且已經安裝了 Node.js (node、npm),但並不需要有 Nokit 的知識,本文將簡單介紹 Nokitjs 的安裝使用,並編寫一個最簡單的 "Hello Word" 。 文中示例是在 Mac OSX 上完成的,整個步驟和 Li
  • 註意:本篇博客,主要參考自《深入理解Java虛擬機(第二版)》 1、對象在記憶體中存儲的佈局分為三塊 對象頭 存儲對象自身的運行時數據:Mark Word(在32bit和64bit虛擬機上長度分別為32bit和64bit),包含如下信息: 對象hashCode 對象GC分代年齡 鎖狀態標誌(輕量級鎖、
  • 如果給定一個list或tuple,我們可以通過for迴圈來遍歷這個list或tuple,這種遍歷我們稱為迭代(Iteration)。 在Python中,迭代是通過for ... in來完成的。 for key in d: print(key) 因為dict的存儲不是按照list的方式順序排列,所以,...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...