具體實現
執行結果
總結本次實驗中抽象資料型別定義如下:
adt sparsematrix
資料關係:r=
row=
col=
基本操作:
createtsmatrix(&tsmat, * s,row, col)
初始條件:s為稀疏矩陣,row為行數,col為s的列數。
操作結果:用三元組表tsmat儲存s,並返回ok。
changevalue(&tsmat, e, i, j)
初始條件:tsmat為稀疏矩陣,e為修改元素,i,j為修改位置。
操作結果:修改稀疏矩陣的i,j位置的元素為e。
getvalue(tsmat, &e,i,j)
初始條件:tsmat為稀疏矩陣,e為傳出元素,i,j為元素位置。
操作結果:獲取稀疏矩陣的i,j位置的元素並用e傳出。
disptsmat(tsmat)
初始條件:tsmat為稀疏矩陣。
操作結果:輸出三元組表。
dispsmat(tsmat)
初始條件:tsmat為稀疏矩陣。
操作結果:輸出稀疏矩陣。
}adt sparsematrix
稀疏矩陣的儲存方式採用三元組順序表儲存。三元組表的結構體中,包含矩陣的行數、列數、非零元素個數和含有非零元素值及位置資訊的三元組表。
目標:建立稀疏矩陣對應的三元組表。
具體過程:
為了增加程式的通用性,建立函式createtsmatrix(tsmatrix& tsmat, elemtype* s, int row, int col)以指標陣列的形式傳入稀疏矩陣,避免使用預定義常量,來限制稀疏矩陣的大小,但需要傳入稀疏矩陣的行數和列數。
將傳入的行數和列數賦給三元組表,並將非零元素個數置零。按行主序遍歷稀疏矩陣,將非零元素存入三元組表中,並將非零元素個數加1。
目標:改變稀疏矩陣中任意乙個元素的值。
具體過程:
在原來非零元素改動到另一非零元素或零元素改動到非零元素的基礎上,增加了非零元素改動到零元素的功能。
非零元素改到另一非零元素相對簡單,而零元素改到非零元素應視為三元組表以行數遞增為序,有序插入乙個三元組,相反非零元素改到零元素應視為三元組表中刪除對應的三元組。
程式中,先尋找到更改位置在三元組表中的位置,再判斷該位置是否有非零元素,如果有,直接更改該位置元素值或執行刪除操作即可,如果沒有,需要執行有序插入操作。每次操作過後,需要更改非零元素個數。
目的:從三元組表中獲取稀疏矩陣任意位置的元素值。
具體操作:
先獲取查詢位置在三元組表中的位置,再判斷該位置是否有非零元素,如果有,直接傳出該位置元素值即可,如果沒有,則傳出0。
目標:分別輸出稀疏矩陣的三元組表和矩陣
具體操作:
輸出三元組錶可參照順序表的輸出方式,輸出矩陣需要判斷迴圈位置的元素是在三元組表中,如果在,則輸出三元組中的值,否則輸出0。
//1、用到的標頭檔案、命名空間和函式執行結果狀態**
#include
using
namespace std;
//函式結果狀態**
#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
//status是函式的型別,其值是函式結果狀況**
typedef
int status;
typedef
int elemtype;
//將elemtype定義為int型別
//2、採用的儲存結構
//-----稀疏矩陣的三元組順序表儲存表示-----
#define maxsize 125
// 假設非零元個數的最大值為125
struct triple
;struct tsmatrix
;//3、基本操作側函式原型說明及實現
//-----基本操作的函式原型說明-----
status createtsmatrix
(tsmatrix& tsmat, elemtype* s,
int row,
int col)
;// 初始條件:s為稀疏矩陣,row為行數,col為s的列數。
// 操作結果:用三元組表tsmat儲存s,並返回ok。
status changevalue
(tsmatrix& tsmat, elemtype e,
int i,
int j)
;// 初始條件:tsmat為稀疏矩陣,e為修改元素,i,j為修改位置。
// 操作結果:修改稀疏矩陣的i,j位置的元素為e。
status getvalue
(tsmatrix tsmat, elemtype& e,
int i,
int j)
;// 初始條件:tsmat為稀疏矩陣,e為傳出元素,i,j為元素位置。
// 操作結果:獲取稀疏矩陣的i,j位置的元素並用e傳出。
void
disptsmat
(tsmatrix tsmat)
;// 初始條件:tsmat為稀疏矩陣。
// 操作結果:輸出三元組表。
void
dispsmat
(tsmatrix tsmat)
;// 初始條件:tsmat為稀疏矩陣。
// 操作結果:輸出稀疏矩陣。
//-----基本操作的演算法描述-----
status createtsmatrix
(tsmatrix& tsmat, elemtype* s,
int row,
int col)
return ok;
}// createtsmatrix
status changevalue
(tsmatrix& tsmat, elemtype e,
int i,
int j)
else
if(tsmat.data[loc]
.i == i && tsmat.data[loc]
.j == j)
// 如果修改位置元素不為0但e為零
return ok;
}// changevalue
status getvalue
(tsmatrix tsmat, elemtype& e,
int i,
int j)
// getvalue
void
disptsmat
(tsmatrix tsmat)
// disptsmat
void
dispsmat
(tsmatrix tsmat)
cout << endl;
// 一行遍歷結束,換行
實驗中採用了指標陣列的形式,建立稀疏矩陣,需要時刻注意陣列越界和記憶體洩漏。而且需要注意的是,三元組表和稀疏矩陣的0位置也儲存有值,如果從位置1開始儲存,需要在合適的地方加減1。
稀疏矩陣是一類特殊矩陣。假設在m×n的矩陣中,有t個元素不為零。令δ=t
m×n\delta =\frac
δ=m×nt
,稱δ
δδ為矩陣的稀疏因子。通常認為δ
≤0.05
δ≤0.05
δ≤0.05
時稱為稀疏矩陣。在實際應用中,稀疏矩陣往往比較大,需要壓縮儲存,在本次實驗中採用三元組順序儲存結構來壓縮稀疏矩陣,並且稀疏矩陣的部分操作通過操作三元組表來實現。
為了增強程式的通用性,儘量減少使用預定義常量,稀疏矩陣的實現採用指標陣列,指標數等於矩陣行數,每個指標申請的空間等於矩陣列數。對陣列中的元素都先賦值0,再對具體的行列賦非零值。雖然矩陣的建立稍微麻煩了些,但增強了程式的通用性,這種操作在後面的實驗中仍有嘗試。
資料結構課程總結
不知不覺,一學期就這樣過去,有遺憾也有收穫。當我懷揣著對新學科的憧憬,第一次上賀老師的課時,我發現資料結構不再是傳統的教學模式,而是採用翻轉課堂的方式,它是由賀老師推廣實施的,這是一次教學上的改革,我們很榮幸成為它的乙份子,追趕時代的新潮流。對於資料結構這門課來說,需要我們下很大的功夫在上面,它是基...
資料結構 課程 總結
時間飛逝,又到學期收尾的時候了,大二上半學期果真是快的不敢想象,不得不感慨一番。經過了一學期資料結構的學習,感覺受益很多。無論在知識上還是從教學模式上都將我們帶入了乙個新的領域。但是在整個學期中,還是有很多值得反思的地方。資料結構是一門很重要的專業課。第一章通過一些基本概念,邏輯結構的相關概念。第一...
資料結構階段總結(二)
棧和佇列 在棧 stack 中,被刪除的元素是最近新增的元素,所以棧的實現方式是後進先出 last in,first out 在佇列中,被刪除的元素是最開始新增的的元素,也就是在動態集合中存放時間最長的那個元素,所以佇列的實現方式是先進先出 first in,first out 在棧的資料結構中,新...