2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  課程設(shè)計報告</b></p><p>  課程名稱 《數(shù)據(jù)結(jié)構(gòu)》 </p><p>  課題名稱 稀疏矩陣實(shí)現(xiàn)與應(yīng)用 </p><p>  專業(yè) 計算機(jī)科學(xué)與技術(shù) </p><p>  班級

2、</p><p>  學(xué)號</p><p>  姓名 </p><p>  聯(lián)系方式 </p><p>  指導(dǎo)教師</p><p>  20 11 年 12 月 25 日</p><p><b>  目

3、 錄</b></p><p>  1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計任務(wù)書1</p><p>  1.1、題目-------------------------------------------------------------------------------------------------1</p><p>  1.2、要求--------------

4、-----------------------------------------------------------------------------------1</p><p>  2、總體設(shè)計 -------------------------------------------------------------------------------------------------1</p&g

5、t;<p>  2.1、功能模塊設(shè)計--------------------------------------------------------------------------------------1</p><p>  2.2、所有功能模塊的流程圖-----------------------------------------------------------------------

6、---2</p><p>  3、詳細(xì)設(shè)計----------------------------------------------------------------------------------------------------3</p><p>  3.1、程序中所采用的數(shù)據(jù)結(jié)構(gòu)及存儲結(jié)構(gòu)的說明----------------------------------------

7、-----10</p><p>  3.2、算法的設(shè)計思想----------------------------------------------------------------------------------10</p><p>  3.3、稀疏矩陣各種運(yùn)算的性質(zhì)變換-------------------------------------------------------

8、---------10</p><p>  4、調(diào)試與測試:--------------------------------------------------------------------------------------------10</p><p>  4.1、調(diào)試方法與步驟: ------------------------------------------------

9、-----------------------------10</p><p>  4.2、測試結(jié)果的分析與討論:----------------------------------------------------------------------11</p><p>  5、時間復(fù)雜度的分析:---------------------------------------------

10、--------------------------------------12</p><p>  6、源程序清單和執(zhí)行結(jié)果--------------------------------------------------------------------------------12</p><p>  7、C程序設(shè)計總結(jié)-------------------------------

11、----------------------------------------------------------20</p><p>  8、致謝--------------------------------------------------------------------------------------------------------20</p><p>  9、參考

12、文獻(xiàn)--------------------------------------------------------------------------------------------------20</p><p>  1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計任務(wù)書</p><p><b>  1.1、題目</b></p><p>  實(shí)現(xiàn)三元組,十字鏈表下

13、的稀疏矩陣的加、轉(zhuǎn)、乘的實(shí)現(xiàn)。</p><p><b>  1.2、要求</b></p><p>  (1).設(shè)計函數(shù)建立稀疏矩陣,初始化值;</p><p>  (2).設(shè)計函數(shù)輸出稀疏矩陣的值;</p><p>  (3).構(gòu)造函數(shù)進(jìn)行兩個稀疏矩陣相加,輸出最終的稀疏矩陣;</p><p> 

14、 (4).構(gòu)造函數(shù)進(jìn)行兩個稀疏矩陣相減,輸出最終的稀疏矩陣;</p><p>  (5).構(gòu)造函數(shù)進(jìn)行稀疏矩陣的轉(zhuǎn)置,并輸出結(jié)果;</p><p><b>  (6).退出系統(tǒng)。</b></p><p><b>  2、總體設(shè)計</b></p><p>  2.1、功能模塊設(shè)計</p>

15、<p>  2.2、所有功能模塊的流程圖</p><p><b>  3、詳細(xì)設(shè)計</b></p><p>  1. 定義程序中所有用到的數(shù)據(jù)及其數(shù)據(jù)結(jié)構(gòu),及其基本操作的實(shí)現(xiàn);</p><p>  typedef struct {</p><p><b>  int i, j;</b>&

16、lt;/p><p><b>  int e;</b></p><p>  } Triple; // 定義三元組的元素</p><p>  typedef struct {</p><p>  Triple data[MAXSIZE + 1];</p><p>  int mu, nu, tu;<

17、/p><p>  } TSMatrix; // 定義普通三元組對象</p><p>  typedef struct {</p><p>  Triple data[MAXSIZE + 2];</p><p>  int rpos[MAXROW + 1];</p><p>  int mu, nu, tu;</p&g

18、t;<p>  } RLSMatrix; // 定義帶鏈接信息的三元組對象</p><p>  typedef struct OLNode { // 定義十字鏈表元素</p><p><b>  int i, j;</b></p><p><b>  int e;</b></p><p&g

19、t;  struct OLNode *right, *down; // 該非零元所在行表和列表的后繼元素</p><p>  } OLNode, *OLink; // 定義十字鏈表元素</p><p>  typedef struct { // 定義十字鏈表對象結(jié)構(gòu)體</p><p>  OLink *rhead, *chead;</p><

20、;p>  int mu, nu, tu; // 系數(shù)矩陣的行數(shù),列數(shù),和非零元素個數(shù)</p><p>  } CrossList; // 定義十字鏈表對象結(jié)構(gòu)體</p><p><b>  2.主函數(shù)</b></p><p>  int main()</p><p><b>  {</b&

21、gt;</p><p><b>  int t;</b></p><p>  cout.fill('*');</p><p>  cout << setw(80) << '*';</p><p>  cout.fill(' ');</p>

22、<p>  cout << setw(50) << "***歡迎使用矩陣運(yùn)算程序***" << endl; //輸出頭菜單</p><p>  cout.fill('*');</p><p>  cout << setw(80) << '*';</p>

23、<p>  cout.fill(' ');</p><p>  cout << " 請選擇要進(jìn)行的操作:" << endl;</p><p>  cout << " 1:矩陣的轉(zhuǎn)置。" <&

24、lt; endl;</p><p>  cout << " 2:矩陣的加法。" << endl;</p><p>  cout << " 3:矩陣的乘法。" << endl;</p><p&g

25、t;  cout << " 4:退出程序。" << endl;</p><p><b>  while(t)</b></p><p><b>  {</b></p><p>  cout<<"請輸入您要進(jìn)行的操作

26、:"<<endl;</p><p><b>  cin>>t;</b></p><p><b>  switch(t)</b></p><p><b>  {</b></p><p><b>  case 1:</b>&l

27、t;/p><p>  TransposeSMatrix(); //調(diào)用矩陣轉(zhuǎn)置函數(shù)</p><p><b>  break;</b></p><p><b>  case 2:</b></p><p>  AddSMatrix(); //調(diào)用矩陣相加函數(shù)</p><p><

28、b>  break;</b></p><p><b>  case 3: </b></p><p>  MultSMatrix(); //調(diào)用矩陣相乘函數(shù)</p><p><b>  break;</b></p><p><b>  case 4:</b>&l

29、t;/p><p><b>  t=0;</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  return 0;&

30、lt;/b></p><p><b>  }</b></p><p><b>  矩陣的轉(zhuǎn)置函數(shù)</b></p><p>  bool TransposeSMatrix() // 求矩陣的轉(zhuǎn)置矩陣</p><p><b>  {</b></p><p&

31、gt;  TSMatrix M, T; //定義預(yù)轉(zhuǎn)置的矩陣</p><p>  InPutTSMatrix(M, 0); //輸入矩陣</p><p>  int num[MAXROW + 1];</p><p>  int cpot[MAXROW + 1]; // 構(gòu)建輔助數(shù)組</p><p>  int q, p, t;</p

32、><p>  T.tu = M.tu;</p><p>  T.mu = M.nu;</p><p>  T.nu = M.mu;</p><p>  if (T.tu) </p><p><b>  {</b></p><p>  for (int col = 1; col

33、<= M.nu; col++) num[col] = 0;</p><p>  for (t = 1; t <= M.tu; t++) ++num[M.data[t].j];</p><p>  cpot[1] = 1;</p><p>  for (int i = 2; i <= M.nu; i++) cpot[i] = cpot[i - 1]

34、+ num[i - 1]; // 求出每一列中非零元素在三元組中出現(xiàn)的位置</p><p>  for (p = 1; p <= M.tu; p++) </p><p><b>  {</b></p><p>  int col = M.data[p].j;</p><p>  q = cpot[col];&l

35、t;/p><p>  T.data[q].i = M.data[p].j;</p><p>  T.data[q].j = M.data[p].i;</p><p>  T.data[q].e = M.data[p].e;</p><p>  ++cpot[col];</p><p><b>  }</b&

36、gt;</p><p><b>  }</b></p><p>  cout << "輸入矩陣的轉(zhuǎn)置矩陣為" << endl;</p><p>  OutPutSMatrix(T);</p><p>  return true;</p><p><

37、b>  }</b></p><p>  bool Count(RLSMatrix &T) {</p><p>  int num[MAXROW + 1];</p><p>  for (int row = 1; row <= T.mu; row++) num[row] = 0;</p><p>  for (i

38、nt col = 1; col <= T.tu; col++) ++num[T.data[col].i];</p><p>  T.rpos[1] = 1;</p><p>  for (int i = 2; i <= T.mu; i++) T.rpos[i] = T.rpos[i - 1] + num[i - 1]; // 求取每一行中非零元素在三元組中出現(xiàn)的位置</p

39、><p>  return true;</p><p><b>  }</b></p><p><b>  矩陣的乘法函數(shù)</b></p><p>  bool MultSMatrix() // 兩個矩陣相乘</p><p><b>  {</b></

40、p><p>  RLSMatrix M, N, Q; // 構(gòu)建三個帶“鏈接信息”的三元組表示的數(shù)組</p><p>  InPutTSMatrix(M, 1); // 用普通三元組形式輸入數(shù)組</p><p>  InPutTSMatrix(N, 1);</p><p><b>  Count(M);</b></p

41、><p><b>  Count(N);</b></p><p>  cout << "輸入的兩矩陣的乘矩陣為:" << endl;</p><p>  if (M.nu != N.mu) return false;</p><p>  Q.mu = M.mu;</p>

42、<p>  Q.nu = N.nu;</p><p>  Q.tu = 0; // Q初始化</p><p>  int ctemp[MAXROW + 1]; // 輔助數(shù)組</p><p>  int arow, tp, p, brow, t, q, ccol;</p><p>  if (M.tu * N.tu

43、) // Q是非零矩陣</p><p><b>  {</b></p><p>  for (arow = 1; arow <= M.mu; arow++) </p><p><b>  {</b></p><p>  ///memset(ctemp,0,N.nu);</p>

44、<p>  for (int x = 1; x <= N.nu; x++) // 當(dāng)前行各元素累加器清零</p><p>  ctemp[x] = 0;</p><p>  Q.rpos[arow] = Q.tu + 1; // 當(dāng)前行的首個非零元素在三元組中的位置為此行前所有非零元素+1</p><p>  if (arow < M.mu)

45、 tp = M.rpos[arow + 1];</p><p>  else tp = M.tu + 1;</p><p>  for (p = M.rpos[arow]; p < tp; p++) // 對當(dāng)前行每個非零元素進(jìn)行操作</p><p><b>  { </b></p><p>  brow =

46、M.data[p].j; // 在N中找到i值也操作元素的j值相等的行</p><p>  if (brow < N.mu) t = N.rpos[brow + 1];</p><p>  else t = N.tu + 1;</p><p>  for (q = N.rpos[brow]; q < t; q++) // 對找出的行當(dāng)每個非零元素進(jìn)行

47、操作</p><p><b>  { </b></p><p>  ccol = N.data[q].j;</p><p>  ctemp[ccol] += M.data[p].e * N.data[q].e; // 將乘得到對應(yīng)值放在相應(yīng)的元素累加器里面</p><p><b>  }</b>

48、;</p><p><b>  }</b></p><p>  for (ccol = 1; ccol <= Q.nu; ccol++) // 對已經(jīng)求出的累加器中的值壓縮到Q中</p><p>  if (ctemp[ccol]) </p><p><b>  {</b></p&g

49、t;<p>  if (++Q.tu > MAXSIZE) return false;</p><p>  Q.data[Q.tu].e = ctemp[ccol];</p><p>  Q.data[Q.tu].i = arow;</p><p>  Q.data[Q.tu].j = ccol;</p><p><

50、b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  OutPutSMatrix(Q);</p><p>  return true;</p><p><b>  }</b&g

51、t;</p><p><b>  矩陣的加法函數(shù)</b></p><p>  bool AddSMatrix() //矩陣的加法</p><p><b>  {</b></p><p>  CrossList M, N; // 創(chuàng)建兩個十字鏈表對象,并初始化</p><p>

52、;  CreateSMatrix_OL(M);</p><p>  CreateSMatrix_OL(N);</p><p>  cout << "輸入的兩矩陣的和矩陣為:" << endl;</p><p>  OLink pa, pb, pre, hl[MAXROW + 1]; //定義輔助指針,pa,pb分別為M,N

53、當(dāng)前比較的元素,pre為pa的前驅(qū)元素</p><p>  for (int x = 1; x <= M.nu; x++) hl[x] = M.chead[x];</p><p>  for (int k = 1; k <= M.mu; k++) // 對M的每一行進(jìn)行操作</p><p><b>  { </b></p>

54、;<p>  pa = M.rhead[k];</p><p>  pb = N.rhead[k];</p><p>  pre = NULL;</p><p>  while (pb) // 把N中此行的每個元素取出</p><p><b>  { </b></p><p><

55、;b>  OLink p;</b></p><p>  if (!(p = (OLink) malloc(sizeof (OLNode)))) exit(0); // 開辟新節(jié)點(diǎn),存儲N中取出的元素</p><p>  p->e = pb->e;</p><p>  p->i = pb->i;</p><

56、;p>  p->j = pb->j;</p><p>  if (NULL == pa || pa->j > pb->j) // 當(dāng)M此行已經(jīng)檢查完或者pb因該放在pa前面</p><p><b>  { </b></p><p>  if (NULL == pre)</p><p>

57、;  M.rhead[p->i] = p;</p><p><b>  else</b></p><p>  pre->right = p;</p><p>  p->right = pa;</p><p><b>  pre = p;</b></p><p&g

58、t;  if (NULL == M.chead[p->j]) // 進(jìn)行列插入</p><p><b>  {</b></p><p>  M.chead[p->j] = p;</p><p>  p->down = NULL;</p><p><b>  } </b></

59、p><p><b>  else </b></p><p><b>  {</b></p><p>  p->down = hl[p->j]->down;</p><p>  hl[p->j]->down = p;</p><p><b>

60、  }</b></p><p>  hl[p->j] = p;</p><p>  pb = pb->right;</p><p><b>  } </b></p><p><b>  else</b></p><p>  if ((NULL != p

61、a) && pa->j < pb->j) // 如果此時的pb元素因該放在pa后面,則取以后的pa再來比較</p><p><b>  { </b></p><p><b>  pre = pa;</b></p><p>  pa = pa->right;</p>&

62、lt;p><b>  } </b></p><p><b>  else</b></p><p>  if (pa->j == pb->j) // 如果pa,pb位于同一個位置上,則將值相加</p><p><b>  { </b></p><p>  pa-

63、>e += pb->e;</p><p>  if (!pa->e) </p><p>  { // 如果相加后的和為0,則刪除此節(jié)點(diǎn),同時改變此元素坐在行,列的前驅(qū)元素的相應(yīng)值</p><p>  if (NULL == pre) // 修改行前驅(qū)元素值</p><p>  M.rhead[pa->i] = pa-&

64、gt;right;</p><p><b>  else</b></p><p>  pre->right = pa->right;</p><p><b>  p = pa;</b></p><p>  pa = pa->right;</p><p>  

65、if (M.chead[p->j] == p) M.chead[p->j] = hl[p->j] = p->down; // 修改列前驅(qū)元素值</p><p><b>  else</b></p><p>  hl[p->j]->down = p->down;</p><p><b>  fr

66、ee(p);</b></p><p>  pb = pb->right;</p><p><b>  } </b></p><p><b>  else </b></p><p><b>  {</b></p><p>  pa = p

67、a->right;</p><p>  pb = pb->right;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</

68、b></p><p>  OutPutSMatrix_OL(M);</p><p>  return true;</p><p><b>  }</b></p><p><b>  創(chuàng)建十字鏈表</b></p><p>  bool CreateSMatrix_OL(C

69、rossList & M)// 創(chuàng)建十字鏈表</p><p><b>  {</b></p><p>  int x, y, m;</p><p>  cout << "請輸入矩陣的行,列,及非零元素個數(shù)" << endl;</p><p>  cin >&g

70、t; M.mu >> M.nu >> M.tu;</p><p>  if (!(M.rhead = (OLink*) malloc((M.mu + 1) * sizeof (OLink)))) exit(0);</p><p>  if (!(M.chead = (OLink*) malloc((M.nu + 1) * sizeof (OLink)))) exit

71、(0);</p><p>  for (x = 0; x <= M.mu; x++)</p><p>  M.rhead[x] = NULL; // 初始化各行,列頭指針,分別為NULL</p><p>  for (x = 0; x <= M.nu; x++)</p><p>  M.chead[x] = NULL;</p

72、><p>  cout << "請按三元組的格式輸入數(shù)組:" << endl;</p><p>  for (int i = 1; i <= M.tu; i++) </p><p><b>  {</b></p><p>  cin >> x >> y

73、 >> m; // 按任意順序輸入非零元,(普通三元組形式輸入)</p><p>  OLink p, q;</p><p>  if (!(p = (OLink) malloc(sizeof (OLNode)))) exit(0); // 開辟新節(jié)點(diǎn),用來存儲輸入的新元素</p><p><b>  p->i = x;</b&g

74、t;</p><p><b>  p->j = y;</b></p><p><b>  p->e = m;</b></p><p>  if (M.rhead[x] == NULL || M.rhead[x]->j > y) </p><p><b>  {<

75、;/b></p><p>  p->right = M.rhead[x];</p><p>  M.rhead[x] = p;</p><p><b>  } </b></p><p><b>  else </b></p><p><b>  {<

76、;/b></p><p>  for (q = M.rhead[x]; (q->right) && (q->right->j < y); q = q->right); // 查找節(jié)點(diǎn)在行表中的插入位置</p><p>  p->right = q->right;</p><p>  q->ri

77、ght = p; // 完成行插入</p><p><b>  }</b></p><p>  if (M.chead[y] == NULL || M.chead[y]->i > x) </p><p><b>  {</b></p><p>  p->down = M.che

78、ad[y];</p><p>  M.chead[y] = p;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  for (q = M.chead[y];

79、(q->down) && (q->down->i < x); q = q->down); // 查找節(jié)點(diǎn)在列表中的插入位置</p><p>  p->down = q->down;</p><p>  q->down = p; // 完成列插入</p><p><b>  }</b&g

80、t;</p><p><b>  }</b></p><p>  return true;</p><p><b>  }</b></p><p><b>  十字鏈表的輸出</b></p><p>  bool OutPutSMatrix_OL(Cro

81、ssList T)// 輸出十字鏈表,用普通數(shù)組形式輸出</p><p><b>  { </b></p><p>  for (int i = 1; i <= T.mu; i++) </p><p><b>  {</b></p><p>  OLink p = T.rhead[i];&l

82、t;/p><p>  for (int j = 1; j <= T.nu; j++) </p><p><b>  {</b></p><p>  if ((p) && (j == p->j))</p><p><b>  {</b></p><p>

83、  cout << setw(3) << p->e;</p><p>  p = p->right;</p><p><b>  } else</b></p><p>  cout << setw(3) << "0";</p><p><

84、;b>  }</b></p><p>  cout << endl;</p><p><b>  }</b></p><p>  return true;</p><p><b>  }</b></p><p>  3.1、程序中所采用的數(shù)據(jù)結(jié)構(gòu)

85、的說明</p><p>  ADT SparseMatrix{       數(shù)據(jù)對象:D={aij | i=1,2,…,m; j=1,2,..,n;</p><p>  aij∈Elemset, m和n分別稱為矩陣的行數(shù)和列數(shù)。} 數(shù)據(jù)關(guān)系:R={Row,Col}    &#

86、160;   Row={<ai,j , ai,j+1> | 1<=i<=m, 1<=j<=n-1}</p><p>  Col= {<ai,j , ai+1,j> | 1<=i<=m-1, 1<=j<=n}基本操作:      CreateSMatr

87、ix(&M);         操作結(jié)果:創(chuàng)建稀疏矩陣M。      DestroySMatrix(&M);         初始條件:稀疏矩陣M存在。 操作結(jié)果:銷毀稀疏矩陣M。 &#

88、160;    PrintSMatrix(M);         初始條件:稀疏矩陣M存在。 操作結(jié)果:輸出稀疏矩陣M。      AddSMatrix(M,N,&Q);       &

89、#160; 初始條件:稀疏矩陣M與N的行數(shù)和列數(shù)對應(yīng)相等 操作結(jié)果:求稀疏矩陣的和Q=M+N。      MultSMatrix(M,N,&Q);         初始條件:稀疏矩陣M的列數(shù)等于N的行數(shù)。 操作結(jié)果:求稀疏矩陣乘積Q=M*N。    &#

90、160;TransposeSMatrix(M,&T);         初始條件:稀疏矩陣M存在。 操作結(jié)果:求稀疏矩陣M的轉(zhuǎn)置矩陣T。     }ADT SparseMatrix</p><p>  3.2、算法的設(shè)計思想</p><p>  本實(shí)驗(yàn)要求在三元組,十字鏈表下

91、實(shí)現(xiàn)稀疏 矩陣的加、轉(zhuǎn)、乘。首先要進(jìn)行矩陣的初始化操作,定義三元組和十字鏈表的元素對象。寫出轉(zhuǎn)置,加法,乘法的操作函數(shù)。通過主函數(shù)調(diào)用實(shí)現(xiàn)在一個程序下進(jìn)行矩陣的運(yùn)算操作。</p><p>  3.3、稀疏矩陣各種運(yùn)算的性質(zhì)變換</p><p><b>  a)加法運(yùn)算</b></p><p>  兩個稀疏矩陣的加和矩陣仍然是稀疏矩陣</p

92、><p><b>  b)乘法運(yùn)算</b></p><p>  兩個稀疏矩陣的乘積矩陣不是稀疏矩陣</p><p><b>  c)轉(zhuǎn)置運(yùn)算</b></p><p>  一個稀疏矩陣的轉(zhuǎn)置矩陣仍然是稀疏矩陣</p><p><b>  4、調(diào)試與測試:</b>

93、;</p><p>  4.1、調(diào)試方法與步驟:</p><p>  實(shí)際完成的情況說明(完成的功能,支持的數(shù)據(jù)類型等);</p><p>  完成了稀疏矩陣的建立,初始化及輸出值的操作。</p><p>  實(shí)現(xiàn)三元組,十字鏈表下的稀疏矩陣的加法,乘法以及轉(zhuǎn)置運(yùn)算。</p><p>  2.程序的性能分析,包括時空分

94、析;</p><p>  能應(yīng)對一般小的錯誤輸入,如果復(fù)雜則自動退出程序。</p><p>  3.上機(jī)過程中出現(xiàn)的問題及其解決方案;</p><p>  1.起始有錯誤,設(shè)定的變量名相同。經(jīng)檢查,改正。</p><p>  2.一些邏輯錯誤。經(jīng)討論改正。運(yùn)行出現(xiàn)部分語法錯誤修正</p><p>  4.程序中可以改進(jìn)

95、的地方說明;</p><p>  程序在運(yùn)行中一旦出現(xiàn)矩陣數(shù)據(jù)格式錯誤如輸入漢字,則程序自動退出。需要重新啟動。更新程序?qū)Ω噱e誤輸入情況的分析能力。</p><p>  5.程序中可以擴(kuò)充的功能及設(shè)計實(shí)現(xiàn)假想。</p><p><b>  對退出操作的擴(kuò)充</b></p><p>  在主菜單下,用戶輸入4回車選擇退出

96、程序是,詢問是否真的退出系統(tǒng),如果是,則即退出系統(tǒng),否則顯示……continue……并且返回主菜單。為了方便由于誤按導(dǎo)致程序退出。</p><p>  在退出時可以增加一段感謝使用本程序的結(jié)束語。</p><p>  4.2、測試結(jié)果的分析與討論:</p><p><b>  系統(tǒng)運(yùn)行主界面</b></p><p>  

97、輸入需要執(zhí)行的操作1矩陣的轉(zhuǎn)置</p><p>  輸入需要執(zhí)行的操作2矩陣的加法</p><p>  輸入需要執(zhí)行的操作3矩陣的乘法</p><p>  輸入錯誤操作時需要重新選擇</p><p><b>  退出操作</b></p><p>  5、時間復(fù)雜度的分析:</p>&

98、lt;p><b>  a)加法運(yùn)算</b></p><p>  由于兩矩陣行列相等,故時間復(fù)雜度為O(行*列)</p><p><b>  b)乘法運(yùn)算</b></p><p>  設(shè)M是m1*n1矩陣,N是m2*n2矩陣,則時間復(fù)雜度是O(m1*n1*n2)</p><p><b>

99、;  c)轉(zhuǎn)置運(yùn)算</b></p><p>  時間復(fù)雜度和原矩陣的列數(shù)及非零元的個數(shù)的乘積成正比,即O(mu*nu)</p><p>  源程序清單和執(zhí)行結(jié)果</p><p>  #include <iostream></p><p>  #include <iomanip></p><

100、;p>  using namespace std;</p><p>  const int MAXSIZE = 100; // 定義非零元素的對多個數(shù)</p><p>  const int MAXROW = 10; // 定義數(shù)組的行數(shù)的最大值</p><p>  typedef struct {</p><p><b> 

101、 int i, j;</b></p><p><b>  int e;</b></p><p>  } Triple; // 定義三元組的元素</p><p>  typedef struct {</p><p>  Triple data[MAXSIZE + 1];</p><p>

102、  int mu, nu, tu;</p><p>  } TSMatrix; // 定義普通三元組對象</p><p>  typedef struct {</p><p>  Triple data[MAXSIZE + 2];</p><p>  int rpos[MAXROW + 1];</p><p>  in

103、t mu, nu, tu;</p><p>  } RLSMatrix; // 定義帶鏈接信息的三元組對象</p><p>  typedef struct OLNode { // 定義十字鏈表元素</p><p><b>  int i, j;</b></p><p><b>  int e;</b&g

104、t;</p><p>  struct OLNode *right, *down; // 該非零元所在行表和列表的后繼元素</p><p>  } OLNode, *OLink; // 定義十字鏈表元素</p><p>  typedef struct { // 定義十字鏈表對象結(jié)構(gòu)體</p><p>  OLink *rhead, *

105、chead;</p><p>  int mu, nu, tu; // 系數(shù)矩陣的行數(shù),列數(shù),和非零元素個數(shù)</p><p>  } CrossList; // 定義十字鏈表對象結(jié)構(gòu)體</p><p>  template <class P></p><p>  bool InPutTSMatrix(P & T,

106、int y) { //輸入矩陣,按三元組格式輸入</p><p>  cout << "輸入矩陣的行,列和非零元素個數(shù):" << endl;</p><p>  cin >> T.mu >> T.nu >> T.tu;</p><p>  cout << "請輸出非

107、零元素的位置和值:" << endl;</p><p>  for (int k = 1; k <= T.tu; k++)</p><p>  cin >> T.data[k].i >> T.data[k].j >> T.data[k].e;</p><p>  return true;</p&g

108、t;<p><b>  }</b></p><p>  template <class P></p><p>  bool OutPutSMatrix(P T) {</p><p>  int m, n, k = 1;</p><p>  for (m = 0; m < T.mu; m++

109、) {</p><p>  for (n = 0; n < T.nu; n++) {</p><p>  if ((T.data[k].i - 1) == m && (T.data[k].j - 1) == n) {</p><p>  cout.width(4);</p><p>  cout << T.d

110、ata[k++].e;</p><p><b>  } else {</b></p><p>  cout.width(4);</p><p>  cout << "0";</p><p><b>  }</b></p><p><b&g

111、t;  }</b></p><p>  cout << endl;</p><p><b>  }</b></p><p>  return true;</p><p>  }// 輸出矩陣,按標(biāo)準(zhǔn)格式輸出</p><p>  bool TransposeSMatrix()

112、 // 求矩陣的轉(zhuǎn)置矩陣</p><p><b>  {</b></p><p>  TSMatrix M, T; //定義預(yù)轉(zhuǎn)置的矩陣</p><p>  InPutTSMatrix(M, 0); //輸入矩陣</p><p>  int num[MAXROW + 1];</p><p>  i

113、nt cpot[MAXROW + 1]; // 構(gòu)建輔助數(shù)組</p><p>  int q, p, t;</p><p>  T.tu = M.tu;</p><p>  T.mu = M.nu;</p><p>  T.nu = M.mu;</p><p>  if (T.tu) </p><

114、;p><b>  {</b></p><p>  for (int col = 1; col <= M.nu; col++) num[col] = 0;</p><p>  for (t = 1; t <= M.tu; t++) ++num[M.data[t].j];</p><p>  cpot[1] = 1;</p&

115、gt;<p>  for (int i = 2; i <= M.nu; i++) cpot[i] = cpot[i - 1] + num[i - 1]; // 求出每一列中非零元素在三元組中出現(xiàn)的位置</p><p>  for (p = 1; p <= M.tu; p++) </p><p><b>  {</b></p>

116、<p>  int col = M.data[p].j;</p><p>  q = cpot[col];</p><p>  T.data[q].i = M.data[p].j;</p><p>  T.data[q].j = M.data[p].i;</p><p>  T.data[q].e = M.data[p].e;&l

117、t;/p><p>  ++cpot[col];</p><p><b>  }</b></p><p><b>  }</b></p><p>  cout << "輸入矩陣的轉(zhuǎn)置矩陣為" << endl;</p><p>  OutP

118、utSMatrix(T);</p><p>  return true;</p><p><b>  }</b></p><p>  bool Count(RLSMatrix &T) {</p><p>  int num[MAXROW + 1];</p><p>  for (int r

119、ow = 1; row <= T.mu; row++) num[row] = 0;</p><p>  for (int col = 1; col <= T.tu; col++) ++num[T.data[col].i];</p><p>  T.rpos[1] = 1;</p><p>  for (int i = 2; i <= T.mu; i

120、++) T.rpos[i] = T.rpos[i - 1] + num[i - 1]; // 求取每一行中非零元素在三元組中出現(xiàn)的位置</p><p>  return true;</p><p><b>  }</b></p><p>  bool MultSMatrix() // 兩個矩陣相乘</p><p><

121、;b>  {</b></p><p>  RLSMatrix M, N, Q; // 構(gòu)建三個帶“鏈接信息”的三元組表示的數(shù)組</p><p>  InPutTSMatrix(M, 1); // 用普通三元組形式輸入數(shù)組</p><p>  InPutTSMatrix(N, 1);</p><p><b>  C

122、ount(M);</b></p><p><b>  Count(N);</b></p><p>  cout << "輸入的兩矩陣的乘矩陣為:" << endl;</p><p>  if (M.nu != N.mu) return false;</p><p>

123、  Q.mu = M.mu;</p><p>  Q.nu = N.nu;</p><p>  Q.tu = 0; // Q初始化</p><p>  int ctemp[MAXROW + 1]; // 輔助數(shù)組</p><p>  int arow, tp, p, brow, t, q, ccol;</p>&l

124、t;p>  if (M.tu * N.tu) // Q是非零矩陣</p><p><b>  {</b></p><p>  for (arow = 1; arow <= M.mu; arow++) </p><p><b>  {</b></p><p>  ///memset(ct

125、emp,0,N.nu);</p><p>  for (int x = 1; x <= N.nu; x++) // 當(dāng)前行各元素累加器清零</p><p>  ctemp[x] = 0;</p><p>  Q.rpos[arow] = Q.tu + 1; // 當(dāng)前行的首個非零元素在三元組中的位置為此行前所有非零元素+1</p><p&

126、gt;  if (arow < M.mu) tp = M.rpos[arow + 1];</p><p>  else tp = M.tu + 1;</p><p>  for (p = M.rpos[arow]; p < tp; p++) // 對當(dāng)前行每個非零元素進(jìn)行操作</p><p><b>  { </b></p

127、><p>  brow = M.data[p].j; // 在N中找到i值也操作元素的j值相等的行</p><p>  if (brow < N.mu) t = N.rpos[brow + 1];</p><p>  else t = N.tu + 1;</p><p>  for (q = N.rpos[brow]; q < t;

128、 q++) // 對找出的行當(dāng)每個非零元素進(jìn)行操作</p><p><b>  { </b></p><p>  ccol = N.data[q].j;</p><p>  ctemp[ccol] += M.data[p].e * N.data[q].e; // 將乘得到對應(yīng)值放在相應(yīng)的元素累加器里面</p><p&

129、gt;<b>  }</b></p><p><b>  }</b></p><p>  for (ccol = 1; ccol <= Q.nu; ccol++) // 對已經(jīng)求出的累加器中的值壓縮到Q中</p><p>  if (ctemp[ccol]) </p><p><b&

130、gt;  {</b></p><p>  if (++Q.tu > MAXSIZE) return false;</p><p>  Q.data[Q.tu].e = ctemp[ccol];</p><p>  Q.data[Q.tu].i = arow;</p><p>  Q.data[Q.tu].j = ccol;&

131、lt;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  OutPutSMatrix(Q);</p><p>  return true;</p><p

132、><b>  }</b></p><p>  bool CreateSMatrix_OL(CrossList & M)// 創(chuàng)建十字鏈表</p><p><b>  {</b></p><p>  int x, y, m;</p><p>  cout << "

133、;請輸入矩陣的行,列,及非零元素個數(shù)" << endl;</p><p>  cin >> M.mu >> M.nu >> M.tu;</p><p>  if (!(M.rhead = (OLink*) malloc((M.mu + 1) * sizeof (OLink)))) exit(0);</p><p&

134、gt;  if (!(M.chead = (OLink*) malloc((M.nu + 1) * sizeof (OLink)))) exit(0);</p><p>  for (x = 0; x <= M.mu; x++)</p><p>  M.rhead[x] = NULL; // 初始化各行,列頭指針,分別為NULL</p><p>  for (

135、x = 0; x <= M.nu; x++)</p><p>  M.chead[x] = NULL;</p><p>  cout << "請按三元組的格式輸入數(shù)組:" << endl;</p><p>  for (int i = 1; i <= M.tu; i++) </p><p&g

136、t;<b>  {</b></p><p>  cin >> x >> y >> m; // 按任意順序輸入非零元,(普通三元組形式輸入)</p><p>  OLink p, q;</p><p>  if (!(p = (OLink) malloc(sizeof (OLNode)))) exit(0);

137、 // 開辟新節(jié)點(diǎn),用來存儲輸入的新元素</p><p><b>  p->i = x;</b></p><p><b>  p->j = y;</b></p><p><b>  p->e = m;</b></p><p>  if (M.rhead[x]

138、== NULL || M.rhead[x]->j > y) </p><p><b>  {</b></p><p>  p->right = M.rhead[x];</p><p>  M.rhead[x] = p;</p><p><b>  } </b></p>

139、<p><b>  else </b></p><p><b>  {</b></p><p>  for (q = M.rhead[x]; (q->right) && (q->right->j < y); q = q->right); // 查找節(jié)點(diǎn)在行表中的插入位置</p&g

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論