版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)二 十字鏈表 一、實(shí)驗(yàn)題目 以十字鏈表為儲(chǔ)存結(jié)構(gòu),實(shí)現(xiàn)稀疏矩陣的求和運(yùn)算。 二、問題描述1、 功能要求:根據(jù)用戶輸入的矩陣,實(shí)現(xiàn)稀疏矩陣的求和運(yùn)算,并輸出結(jié)果。2、 輸入要求:矩陣的數(shù)據(jù)在程序運(yùn)行的時(shí)候由用戶提供,先由用戶輸入稀疏矩陣的行數(shù)、列數(shù)和非零元個(gè)數(shù)。再根據(jù)非零元個(gè)數(shù),輸入這些非零元,還需要用戶為這些非零元輸入行、列和非零元的值。這樣,一個(gè)稀疏矩陣就輸入完成。 若輸入3 3 2 則表示這個(gè)稀疏矩陣有3行3列2個(gè)非零元 然后用戶需要為這兩個(gè)非零元輸入行、列、非零元的值 如:1 1 22 2 1 表示第一個(gè)非零元行為1,列為1,,值為2;第二個(gè)非零元行為2,列為2,值為1。 此過程輸入
2、的稀疏矩陣為: 2 0 0 0 1 0 0 0 03、 輸出要求:輸出按矩陣輸出,按行列依次輸出,非零元?jiǎng)t輸出非零元的值,不是非零元?jiǎng)t輸出“0”。各元素之間用空格隔開。最后輸出完整的矩陣。 三、概要設(shè)計(jì)1稀疏矩陣的抽象數(shù)據(jù)類型定義如下:adt sparsematrix 數(shù)據(jù)對(duì)象: d=aij|i=1,2,3m,j=1,2,3n; aij屬于elemset,m和n分別是稀疏矩陣的行數(shù)和列數(shù)數(shù)據(jù)關(guān)系: r= row, col row=<aij,aij+1>|1<=i<=m,1<=j<=n-1col=<aij,ai+1j>|1<=i<=m-
3、1,1<=j<=n基本操作:createsmatrix(&m);/建立稀疏矩陣mdestroysmatrix(&m);/銷毀稀疏矩陣m;transposesmatrix(m);/求稀疏矩陣的轉(zhuǎn)置矩陣addsmatrix(&m,&n);/求稀疏矩陣m和n之和mulsmatrix(&m,&n);/求稀疏矩陣m和n之積adt sparsematrix2、 存儲(chǔ)結(jié)構(gòu)選擇采用十字鏈表存儲(chǔ)稀疏矩陣,它是稀疏矩陣鏈?zhǔn)奖硎镜囊环N較好的表示方法。在十字鏈表中,每一個(gè)非零矩陣元素存儲(chǔ)在一個(gè)結(jié)點(diǎn)內(nèi)。每一個(gè)節(jié)點(diǎn)除了存儲(chǔ)非零元素的三元組以外,還設(shè)置了right
4、和down兩個(gè)指針,分別指向同一行的下一個(gè)非零元素結(jié)點(diǎn)和同一列的下一個(gè)非零元結(jié)點(diǎn)。3、 其他函數(shù)1) 主函數(shù)main()2) 作為友元函數(shù)的加法運(yùn)算。4、 詳細(xì)設(shè)計(jì)用十字鏈表表示稀疏矩陣,需要定義結(jié)點(diǎn)類和鏈表類兩個(gè)類1、 結(jié)點(diǎn)類matrixnodetemplate<class type>class matrixnode friend class linkmatrix<type>friend istream&operator>>(istream&,linkmatrix<type>&); friend ostream&
5、operator<<(ostream&out, linkmatrix<type>&); friend linkmatrix<type> operator +(const linkmatrix<type> &a,const linkmatrix<type> &b);private:int row,col;matrixnode<type>*right,*down;uniontype data;matrixnode<type>*next;2、 鏈表類template<class
6、type>class linkmatrixprivate:matrixnode<type> *head;void insertincol(matrixnode<type>*p);void deleteincol(matrixnode<type>*p);public:friend istream&operator>>(istream&in,linkmatrix<type>&);friend ostream&operator<<(ostream&out,linkmatrix<
7、type>&);matrixnode<type>* head(int i);linkmatrix<type>&operator +=(const linkmatrix<type> &a);friend linkmatrix<type> operator +(const linkmatrix<type> &a,const linkmatrix<type> &b); ;3、 求頭結(jié)點(diǎn)函數(shù)template<class type> matrixnode<type>
8、;* linkmatrix<type>:head(int i) matrixnode<type>*a;a=head->next;for(int j=1;j<i;j+)a=a->next; return a;4、 將結(jié)點(diǎn)p插入p->col列中template<class type>void linkmatrix<type>:insertincol(matrixnode<type>*p)matrixnode<type>*pre,*ch=head(p->col);pre=ch;while(pre-&
9、gt;down!=ch&&pre->down->row<p->row)pre=pre->down;p->down=pre->down;pre->down=p;5、 在p->col列中刪除結(jié)點(diǎn)p,并釋放空間template<class type>void linkmatrix<type>:deleteincol(matrixnode<type>*p)matrixnode<type>*pre,*ch=head(p->col);pre=ch;while(pre->down
10、!=ch&&pre->down!=p)pre=pre->down;if(pre->down=p)pre->down=p->down;delete p;6、 重載>>函數(shù)template<class type>istream&operator>>(istream&in,linkmatrix<type>&a)int m,n,terms,s;matrixnode<type>*cp,*p,*q;cout<<"輸入矩陣的行數(shù)、列數(shù)、和非零元素個(gè)數(shù)&quo
11、t;<<endl;in>>m>>n>>terms;if(n>m)s=n;else s=m;a.head=new matrixnode<type>a.head->row=m;a.head->col=n;a.head->right=a.head->down=null;cp=new matrixnode<type>*s+1;cp0=a.head;int i;for(i=1;i<=s;i+)p=new matrixnode<type>p->row=p->col=0;p-&
12、gt;right=p->down=p;cpi=p;cpi-1->next=p;cps->next=a.head;for(i=1;i<=terms;i+)cout<<"輸入一個(gè)非零元三元組(row,col,value)"<<endl;p=new matrixnode<type>in>>p->row>>p->col>>p->data;q=cpp->row;while(q->right!=cpp->row&&(q->right-
13、>col<p->col)q=q->right;p->right=q->right;q->right=p;q=cpp->col;while(q->down!=cpp->row&&(q->down->col<p->col)q=q->down;p->down=q->down;q->down=p;deletecp;return in;7、 重載<<函數(shù)template<class type>ostream & operator<<(os
14、tream & out ,linkmatrix<type>& a)for(int i=1;i<=a.head->row;i+)matrixnode<type>*b=a.head(i);b=b->right;for(int j=1;j<=a.head->col;j+)if(b->row=i&&b->col=j)cout<<b->data<<' 'b=b->right;elsecout<<'0'<<'
15、'cout<<endl;return out; 8、 重載+=實(shí)現(xiàn)求和函數(shù)template<class type> /重載符合賦值運(yùn)算符+=linkmatrix<type>&linkmatrix<type>:operator +=(const linkmatrix<type> &a)matrixnode<type> *pre,*pa,*h,*ah,*p,*tmp;if(head->col !=a.head->col|head->row !=a.head->row)/非同型矩陣
16、不可相加cout<<"the two matrice aren't isomorphic!"/throw domain_error("the two matrice aren't isomorphic!");h=head->next;ah=a.head->next; /h、ah指向當(dāng)前處理行的頭結(jié)點(diǎn)while(h !=head) /逐一處理各行pre=h; p=h->right; /p指向被加矩陣的當(dāng)前結(jié)點(diǎn),pre指向其前驅(qū)pa=ah->right; /pa分別指向加矩陣的當(dāng)前結(jié)點(diǎn)while(pa !=
17、ah) /處理當(dāng)前行if(p !=h&&(p->col<pa->col) /若被加矩陣的列標(biāo)更小,則比較下一個(gè)pre=p; p=p->right;else if(p=h|p->col>pa->col) tmp=new matrixnode<type>(*pa) ;pre->right=tmp; /在行鏈表中插入pa復(fù)制結(jié)點(diǎn)tmptmp->right=p;insertincol(tmp); /在列表中插入tmppre=tmp; /當(dāng)前指針p的前驅(qū)變?yōu)閠mppa=pa->right;else /列標(biāo)相同,則做加
18、法p->data +=pa->data;if(!p->data) /和為0,則刪除之 (行、列都要?jiǎng)h除)tmp=p;p=p->right;pre->right=p;/在行鏈表中將tmp摘下deleteincol(tmp); /在列鏈表中將tmp刪除pre=p;p=p->right;pa=pa->right;h=h->next; ah=ah->next; /處理下一行return *this;9、 重載+template<class type> /重載加法運(yùn)算符+linkmatrix<type> operator +(
19、const linkmatrix<type> &a,const linkmatrix<type> &b)linkmatrix<type> c(a); /復(fù)制構(gòu)造函數(shù)得到被加矩陣a的一個(gè)副本放在矩陣c中c+=b;return c;5、 調(diào)試與測(cè)試1、 編譯環(huán)境visual c+ 6.02、 main函數(shù)int main()linkmatrix<int>a,b,c;cin>>a;cout<<"a矩陣為:n"<<a<<endl;cin>>b;cout<
20、<"b矩陣為:n"<<b<<endl;c=a+b;cout<<"a+b=n"<<c<<endl;system("pause");return 0;3、 具體步驟按f5編譯,界面出現(xiàn)提示“請(qǐng)輸入行數(shù)、列數(shù)、非零元個(gè)數(shù)”。輸入3 3 3表示這個(gè)矩陣行數(shù)為3,列數(shù)為3,非零元個(gè)數(shù)為3,接著提示“請(qǐng)輸入一個(gè)非零元三元組<row,col,value>”。輸入1 1 1表示第一個(gè)三元組的行為1,列為1,值為1然后程序繼續(xù)提示“輸入一個(gè)非零元三元組<row,col,
21、value>”。按要求再依次輸入2 2 23 1 5則矩陣a輸入完成,程序按矩陣格式輸出矩陣a程序繼續(xù)提示“請(qǐng)輸入行數(shù)、列數(shù)、非零元個(gè)數(shù)”在按上述操作繼續(xù)輸入3 3 41 1 22 1 13 1 13 3 3為矩陣b輸入,完成后程序輸入矩陣b程序同時(shí)輸出a+b3、 結(jié)果分析程序提供輸入和輸出,根據(jù)輸入的矩陣a和矩陣b,a+b計(jì)算結(jié)果準(zhǔn)確無誤。6、 使用說明使用本程序簡單明了,只需根據(jù)提示為稀疏矩陣輸入,就可以計(jì)算出稀疏矩陣的和。附錄2: 十字鏈表實(shí)現(xiàn)稀疏矩陣相加源程序 軟件2班 201113040207#include<iostream>using namespace std
22、;template<class type>class matrixnode; template<class type>class linkmatrix;template<class type>istream &operator>>(istream &,linkmatrix<type>&);template<class type>ostream &operator<<(ostream &,linkmatrix<type>&);template<cl
23、ass type>linkmatrix<type> operator +(const linkmatrix<type> &a,const linkmatrix<type> &b);template<class type>class matrixnode friend class linkmatrix<type>friend istream&operator>>(istream&,linkmatrix<type>&); friend ostream&opera
24、tor<<(ostream&out, linkmatrix<type>&); friend linkmatrix<type> operator +(const linkmatrix<type> &a,const linkmatrix<type> &b);private:int row,col;matrixnode<type>*right,*down;uniontype data;matrixnode<type>*next;template<class type>cla
25、ss linkmatrixprivate:matrixnode<type> *head;void insertincol(matrixnode<type>*p);void deleteincol(matrixnode<type>*p);public:friend istream&operator>>(istream&in,linkmatrix<type>&);friend ostream&operator<<(ostream&out,linkmatrix<type>&am
26、p;);matrixnode<type>* head(int i);linkmatrix<type>&operator +=(const linkmatrix<type> &a);friend linkmatrix<type> operator +(const linkmatrix<type> &a,const linkmatrix<type> &b); ;int main()linkmatrix<int>a,b,c;cin>>a;cout<<"
27、a矩陣為:n"<<a<<endl;cin>>b;cout<<"b矩陣為:n"<<b<<endl;c=a+b;cout<<"a+b=n"<<c<<endl;system("pause");return 0;template<class type>istream&operator>>(istream&in,linkmatrix<type>&a)int m,n,te
28、rms,s;matrixnode<type>*cp,*p,*q;cout<<"輸入矩陣的行數(shù)、列數(shù)、和非零元素個(gè)數(shù)"<<endl;in>>m>>n>>terms;if(n>m)s=n;else s=m;a.head=new matrixnode<type>a.head->row=m;a.head->col=n;a.head->right=a.head->down=null;cp=new matrixnode<type>*s+1;cp0=a.head;
29、int i;for(i=1;i<=s;i+)p=new matrixnode<type>p->row=p->col=0;p->right=p->down=p;cpi=p;cpi-1->next=p;cps->next=a.head;for(i=1;i<=terms;i+)cout<<"輸入一個(gè)非零元三元組(row,col,value)"<<endl;p=new matrixnode<type>in>>p->row>>p->col>>
30、p->data;q=cpp->row;while(q->right!=cpp->row&&(q->right->col<p->col)q=q->right;p->right=q->right;q->right=p;q=cpp->col;while(q->down!=cpp->row&&(q->down->col<p->col)q=q->down;p->down=q->down;q->down=p;deletecp;return
31、 in;template<class type> matrixnode<type>* linkmatrix<type>:head(int i) matrixnode<type>*a;a=head->next;for(int j=1;j<i;j+)a=a->next; return a;template<class type>void linkmatrix<type>:insertincol(matrixnode<type>*p)matrixnode<type>*pre,*ch=he
32、ad(p->col);pre=ch;while(pre->down!=ch&&pre->down->row<p->row)pre=pre->down;p->down=pre->down;pre->down=p;template<class type>void linkmatrix<type>:deleteincol(matrixnode<type>*p)matrixnode<type>*pre,*ch=head(p->col);pre=ch;while(pre-&g
33、t;down!=ch&&pre->down!=p)pre=pre->down;if(pre->down=p)pre->down=p->down;delete p;/else throw invalid_arguement("no such a node to be deleted in deleteincol()");template<class type> /重載符合賦值運(yùn)算符+=linkmatrix<type>&linkmatrix<type>:operator +=(const
34、linkmatrix<type> &a)matrixnode<type> *pre,*pa,*h,*ah,*p,*tmp;if(head->col !=a.head->col|head->row !=a.head->row)/非同型矩陣不可相加cout<<"the two matrice aren't isomorphic!"/throw domain_error("the two matrice aren't isomorphic!");h=head->next;ah=a.head->next; /h、ah指向當(dāng)前處理行的頭結(jié)點(diǎn)while(h !=head) /逐一處理各行pre=h; p=h->right; /p指向被加矩陣的當(dāng)前結(jié)點(diǎn),pre指向其前驅(qū)pa=ah->right; /pa分別指向加矩陣的當(dāng)前結(jié)點(diǎn)whi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 擔(dān)保合同的范本(2篇)
- 二零二五版排水溝施工與海綿城市雨水花園建設(shè)合同4篇
- 2025年度油氣田打井工程安全監(jiān)理與風(fēng)險(xiǎn)評(píng)估合同4篇
- 2025年度某三期護(hù)坡樁工程安全質(zhì)量達(dá)標(biāo)施工合同4篇
- 2025年度智能駕駛輔助系統(tǒng)軟件授權(quán)合同變更3篇
- 2025年教育教學(xué)設(shè)備進(jìn)出口代理服務(wù)合同3篇
- 二零二五年度出租車公司車輛新能源推廣與應(yīng)用合同3篇
- 2025年度環(huán)保設(shè)備投標(biāo)保密合同
- 2025年度個(gè)人房產(chǎn)買賣交易保險(xiǎn)合同4篇
- 二零二五年度進(jìn)口牛奶品牌代理銷售合同范本3篇
- 中央2025年國務(wù)院發(fā)展研究中心有關(guān)直屬事業(yè)單位招聘19人筆試歷年參考題庫附帶答案詳解
- 2024年09月北京中信銀行北京分行社會(huì)招考(917)筆試歷年參考題庫附帶答案詳解
- 外呼合作協(xié)議
- 小學(xué)二年級(jí)100以內(nèi)進(jìn)退位加減法800道題
- 保險(xiǎn)公司2025年工作總結(jié)與2025年工作計(jì)劃
- 2024年公司領(lǐng)導(dǎo)在新年動(dòng)員會(huì)上的講話樣本(3篇)
- 眼科護(hù)理進(jìn)修專題匯報(bào)
- GB/T 33629-2024風(fēng)能發(fā)電系統(tǒng)雷電防護(hù)
- 深靜脈血栓(DVT)課件
- 2023年四川省廣元市中考數(shù)學(xué)試卷
- GB/T 19885-2005聲學(xué)隔聲間的隔聲性能測(cè)定實(shí)驗(yàn)室和現(xiàn)場(chǎng)測(cè)量
評(píng)論
0/150
提交評(píng)論