1. 程式人生 > >資料結構1——稀疏多項式乘法計算器

資料結構1——稀疏多項式乘法計算器

一元稀疏多項式簡單計算器

(1)輸入並建立多項式;
(2)輸出多項式,輸出形式為整數序列: n,c1,e1,c2,e2,…,cn,en,其中n是多項式的項數,ci和ei分別是第i項的係數和指數,序列按指數降序排列。
(3)多項式a與多項式b相乘,建立多項式。
在寫程式碼的過程中,對其中沒有掌握的各個知識點的梳理和記錄。

1、struct結構體

typedef struct Polynomial{
            float coef; //係數
            int expn; //指數
            struct Polynomial *next;
            //Polynomial(double a, int b){coef = a; expn = b;}
Polynomial(){}; }Polyn,*Poly;
struct P{
......
}PO,*PO2
PO *p 與 PO2 p 等價,都是指向P的指標。

typedef 和 struct
 在c++中如果用typedef的話,會造成區別:

struct   Student   
    {   
    int   a;   
    }stu1;//stu1是一個Student變數  

    typedef   struct   Student2   
    {   
    int   a;   
    }stu2;//stu2是一個結構體型別=struct Student  

    使用時可以直接訪問stu1.a
    但是stu2則必須先 stu2 s2;
    然後 s2.a=10;

在C++中,後者可以有
1. struct Student2 變數名
2. Student2 變數名
3. stu2 變數名

2、struct建構函式

結構體例項和類例項的初始化方法完全相同,二者都可以應用於繼承層次中。不同點是結構體預設成員為public,而類預設成員是private。

若類和結構體所有資料成員均為public型,可採取如下帶花括號形式進行初始化。
注意:
① 不論值的個數多少,都必須使用花括號定界
② 未指定值的資料成員編譯器會自動初始化為預設值
③ 這種初始化物件方式,要求所有資料成員必須為public型
④ 這種初始化物件方式,要求類中不能編寫任何建構函式

添加了建構函式的struct相當於成員全部public的類,而類的例項化必須通過建構函式,所以不能再使用{}初始化。

3、函式返回指標變數

C++允許函式返回區域性指標,前提是指標指向的地址在函式退出後仍然有效。這涉及到C++記憶體分配問題。如果指標指向的內容是區域性陣列等存在與棧記憶體中的,則函式執行完後內容被銷燬。

4、C++記憶體分配

C++編譯器將計算機記憶體分為程式碼區和資料區。
資料區分配方式如下圖所示:

這裡寫圖片描述

不涉及動態分配的物件有嚴格定義的生存期。全域性物件在程式啟動時分配,程式結束時銷燬。區域性物件,在我們進入其定義所在的程式塊時被建立,在程式結束時銷燬。區域性static物件在第一次使用前分配,在程式結束時銷燬。

動態分配的物件的生存期與它們在哪裡建立無關,只有顯式地被釋放時,才會銷燬。

void f() {
int* p=newint[5];
}
delete []p;

5、指標問題

1)用malloc申請多個同名指標,或new多個同名指標,指標指向最後一次開闢的空間。
2)複製指標時複製指標本身所含的地址值,而不會複製指標指向的內容。

3)void *malloc(long NumBytes):該函式分配了NumBytes個位元組,並返回了指向這塊記憶體的指標。如果分配失敗,則返回一個空指標(NULL)。
關於分配失敗的原因,應該有多種,比如說空間不足就是一種。
void free(void *FirstByte): 該函式是將之前用malloc分配的空間還給程式或者是作業系統,也就是釋放了這塊記憶體,讓它重新得到自由。

4)free 和 delete 釋放的都是指標指向的記憶體。指標是一個變數,只有程式結束時才被銷燬。

貼一下程式碼

#include <iostream>
#include <string>
#include<sstream>
#include <vector>
using namespace std;


typedef struct Polynomial{
    double coef; //係數
    int expn; //指數                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
    struct Polynomial *next;
    Polynomial(double a, int b){coef = a; expn = b; next = NULL;}
    Polynomial(){};
}Polyn,*Poly;



Polyn* CreatePolyn(Polyn *head,int n){
    Poly h2 = NULL;
    int i = 1;
    for(; i<(n+1); i++){
        cout<<"輸入第"<<i<<"項的係數和指數"<<endl;
        double co; int ex;
        Poly po = new Polynomial();
        cin>>co>>ex; 
        po->coef = co; po->expn = ex; po->next = NULL;
        if (head == NULL){head = po; h2 = head;} // head有值
        else{
                head->next = po;
                head = head->next;
            }
        }
    return h2;
}

void PrintPolyn(Polyn *head){
    /*vector<string> polystr; string tp;
    while(head->next != NULL){  
        polystr.push_back(tp);
        istringstream temp(head->coef);
        temp>>tp;
        polystr.push_back(tp);
        head = head->next;
    }*/

    for(; head != NULL; head= head->next){
        if(head->coef == 0)  continue;
        int coe = head->coef * 100; double coe1 = coe/100;
        head->coef = coe1;
        if( coe1 >1 ) cout<<coe1;
        if( head->expn>1 ) cout<<"x^"<<head->expn;
        else if ( head->expn = 1 ) cout<<"x";
        if( head->next && ! ( head->next->coef < 0 ) ) cout<<"+";
        else if ( head->next && head->next->coef < 0) cout<<"-";
    }

};

Polyn* MultiPolyn(Poly head1,Poly head2){
    Poly ml = NULL ;  Poly re = NULL;
    while( head1!= NULL ){
        double coe1 = head1->coef;
        int exp1 = head1->expn;
        for( Poly h2 = head2; h2 != NULL; h2 = h2->next){
            Poly po = new Polyn();
            po->coef = coe1 * h2->coef;
            po->expn = exp1 + h2->expn;
            po->next = NULL;
            if ( ml == NULL ) { 
                ml = po;
                re = ml;
            }else{
                ml->next = po;
                ml = ml->next;
            }
        }
        head1 = head1->next;
    }
    for( Poly p = re; p != NULL; p=p->next){
        double out = p->coef; int out1 = p->expn;
        for( Poly p2 = p->next; p2 !=NULL; p2=p2->next){
            if (p2->expn == out1) {
                p->coef += p2->coef;
                p2->coef = 0;  p2->expn=0;
            }
        }
        cout<<p->coef<<p->expn<<endl;
    }
    return re;
}

int main(){

    cout<<"####################################"<<endl;
    cout<<endl;
    cout<<"      一元稀疏多項式乘法計算器      "<<endl;
    cout<<endl;
    cout<<"####################################"<<endl;

    int n1, n2, tr=0, ta = 0, tb =0;
    Poly head1=NULL, head2 = NULL, head3 = NULL;

    while(tr != 1){
        cout<<"請輸入多項式a和b的項數"<<endl;
        cin>>n1>>n2;
        cout<<"確認輸入1;輸入其他數字重新輸入"<<endl;
        cin>>tr;
    } 

    while(ta != 1){
        cout<<"依次輸入多項式a每項的係數和指數,回車結束"<<endl;
        head1 = CreatePolyn(head1,n1);
        cout<<"多項式a為:";
        PrintPolyn(head1);
        cout<<"確認輸入1;輸入其他數字重新輸入"<<endl;
        cin>>ta;
    }   
    while(tb != 1){
        cout<<"依次輸入多項式b每項的係數和指數,回車結束"<<endl;
        head2 = CreatePolyn(head2,n2);
        cout<<"多項式b為:";
        PrintPolyn(head2);
        cout<<"確認輸入1;輸入其他數字重新輸入"<<endl;
        cin>>tb;
    }

    cout<<"多項式相乘:"<<endl;

    PrintPolyn( MultiPolyn( head1,head2 ) );

    system("pause");

}