資料結構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");
}