一元多項式的運算

来源: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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...