課程設(shè)計---稀疏矩陣應(yīng)用_第1頁
已閱讀1頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  數(shù)學(xué)與計算機學(xué)院</b></p><p><b>  課程設(shè)計說明書</b></p><p>  課 程 名 稱: 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計 </p><p>  課 程 代 碼: 8404181 </p><p>  題 目:

2、 稀疏矩陣應(yīng)用 </p><p>  年級/專業(yè)/班: </p><p>  學(xué) 生 姓 名: </p><p>  學(xué)   號: </p><p>  開 始 時 間: 2011 年 06 月 13 日&l

3、t;/p><p>  完 成 時 間: 2011 年 06 月 21 日</p><p><b>  課程設(shè)計成績:</b></p><p>  指導(dǎo)教師簽名: 年 月 日</p><p><b>  目 錄</b></p><

4、p><b>  1 引 言1</b></p><p>  1.1 問題的提出1</p><p>  1.2國內(nèi)外研究的現(xiàn)狀1</p><p>  1.3任務(wù)與分析 1</p><p>  2 程序的主要功能1</p><p>  2.1三元組的轉(zhuǎn)置1</p>&l

5、t;p>  2.2三元組的加法1</p><p>  2.3三元組的減法1</p><p>  2.4三元組的乘法2</p><p>  2.5十字鏈表的轉(zhuǎn)置2</p><p>  2.6十字鏈表的加法2</p><p>  2.7十字鏈表的減法2</p><p>  2.8十

6、字鏈表的乘法2</p><p><b>  3程序運行平臺3</b></p><p><b>  4總體設(shè)計3</b></p><p><b>  5程序類的說明4</b></p><p><b>  6 模塊分析5</b></p>

7、<p>  6.1 三元組的轉(zhuǎn)置5</p><p>  6.2 三元組減法6</p><p>  6.3三元組的減法9</p><p>  6.4三元組的乘法12</p><p>  6.5 十字鏈表的轉(zhuǎn)置14</p><p>  6.6 十字鏈表的加法15</p><p&g

8、t;  6.7十字鏈表的減法18</p><p>  6.8十字鏈表的乘法22</p><p><b>  7 系統(tǒng)測試25</b></p><p>  7.1三元組的轉(zhuǎn)置25</p><p>  7.2 三元組的加法26</p><p>  7.3 三元組的減法26</p>

9、;<p>  7.4 三元組的乘法27</p><p>  7.5 十字鏈表的轉(zhuǎn)置27</p><p>  7.6十字鏈表的加法28</p><p>  7.7 十字鏈表的減法28</p><p>  7.8 十字鏈表的乘法29</p><p><b>  7.9 總結(jié)29</

10、b></p><p><b>  8結(jié)論29</b></p><p><b>  參考文獻29</b></p><p><b>  摘 要 </b></p><p>  隨著計算機的普及,一句話引出題目…(小四楷體_GB2312),分析了三元組和十字鏈表的存儲和各

11、種運算的實現(xiàn),利用C語言編程實現(xiàn)了稀疏矩陣的運算系統(tǒng),該系統(tǒng)具有三元組十字鏈表存儲下的稀疏矩陣轉(zhuǎn)置、加法、減法、乘法的功能。</p><p>  關(guān)鍵詞:稀疏矩陣;計算機; 運算器</p><p><b>  1 引 言 </b></p><p>  1.1 問題的提出 </p><p>  矩陣是很多科學(xué)與工程計算問

12、題中研究的數(shù)學(xué)對象。因此,我們感興趣的不是矩陣本身,而是如何存儲矩陣的元,從而使矩陣的各種運算能有效地進行。</p><p>  通常,用高級語言編制程序時,都是用二維數(shù)組來存儲矩陣元,有的程序設(shè)計語言中還提供了各種矩陣運算,用戶使用時很方便。</p><p>  然而,在數(shù)值分析中,經(jīng)常出現(xiàn)一些階數(shù)很高的矩陣,同時在矩陣中有許多值相同的元素或者是零元素,有時為了節(jié)省存儲空間,可以對這類矩

13、陣進行壓縮存儲。所謂壓縮存儲,就是指:為多個值相同的元只分配一個存儲空間;對零元不分配空間。</p><p>  1.2國內(nèi)外研究的現(xiàn)狀 </p><p>  目前已經(jīng)可以用于人臉識別、子空間方法預(yù)處理技術(shù)稀疏近似逆按模最小特征值修正矩陣廣義極小殘余方法等方面。</p><p>  1.3任務(wù)與分析 </p><p>  (1)給出算法并編

14、程實現(xiàn);</p><p> ?。?)任給實例并演示求解結(jié)果;</p><p>  (3)給出時間復(fù)雜度分析;</p><p> ?。?)結(jié)合所完成題目,分析總結(jié)各算法所使用的算法設(shè)計技術(shù),以及相應(yīng)技術(shù)的基本思想。</p><p><b>  2 程序的主要功能</b></p><p><b&

15、gt;  2.1三元組的轉(zhuǎn)置</b></p><p>  將一個按三元組存儲的稀疏矩陣進行轉(zhuǎn)置。</p><p><b>  2.2三元組的加法</b></p><p>  將兩個按三元組存儲的稀疏矩陣進行相加并得出結(jié)果。</p><p><b>  2.3三元組的減法</b></

16、p><p>  將兩個按三元組存儲的稀疏矩陣進行相減并得出結(jié)果。</p><p><b>  2.4三元組的乘法</b></p><p>  將兩個按三元組存儲的稀疏矩陣進行相乘并得出結(jié)果。</p><p>  2.5十字鏈表的轉(zhuǎn)置</p><p>  將一個按十字鏈表存儲的稀疏矩陣進行轉(zhuǎn)置。<

17、/p><p>  2.6十字鏈表的加法</p><p>  將兩個按十字鏈表存儲的稀疏矩陣進行相加并得出結(jié)果。</p><p>  2.7十字鏈表的減法</p><p>  將兩個按十字鏈表存儲的稀疏矩陣進行相加并得出結(jié)果。</p><p>  2.8十字鏈表的乘法</p><p>  將兩個按十字

18、鏈表存儲的稀疏矩陣進行相加并得出結(jié)果。</p><p><b>  3程序運行平臺</b></p><p>  VC++6.0。編譯,鏈接,執(zhí)行。</p><p><b>  4總體設(shè)計</b></p><p>  圖4.1 系統(tǒng)總體框架圖</p><p><b>

19、  5程序類的說明</b></p><p>  OLNode結(jié)構(gòu)聲明</p><p>  typedef struct OLNode</p><p><b>  {</b></p><p><b>  int i,j;</b></p><p><b> 

20、 int e;</b></p><p>  struct OLNode *right,*down;</p><p>  }OLNode,*OLink;</p><p>  Crosslist結(jié)構(gòu)的聲明</p><p>  typedef struct </p><p><b>  {</b&

21、gt;</p><p>  int mu,nu,tu;</p><p>  OLink *rhead,*chead;</p><p>  }CrossList;</p><p>  Triple結(jié)構(gòu)的聲明</p><p>  typedef struct</p><p><b>  {

22、</b></p><p><b>  int i,j;</b></p><p><b>  int e;</b></p><p><b>  }Triple;</b></p><p>  TSMatrix結(jié)構(gòu)的聲明</p><p>  typ

23、edef struct</p><p><b>  {</b></p><p>  Triple data[maxsize];</p><p>  int rpos[maxsize+1]; </p><p>  int nu,mu,tu;</p><p>  }TSMatrix;</p>

24、;<p><b>  6 模塊分析</b></p><p>  6.1 三元組的轉(zhuǎn)置</p><p>  將一個按三元組存儲的稀疏矩陣進行轉(zhuǎn)置(非快速轉(zhuǎn)置)。</p><p>  void TransposeSMatrix(TSMatrix M,TSMatrix &T)//三元組的轉(zhuǎn)置</p><p&g

25、t;<b>  {</b></p><p>  T.nu=M.mu;</p><p>  T.mu=M.nu;</p><p>  T.tu=M.tu;</p><p><b>  int q=1;</b></p><p>  for(int col=1;col<=M.

26、nu;col++)</p><p>  for(int p=1;p<=M.tu;p++)</p><p>  if(M.data[p].j==col)</p><p><b>  {</b></p><p>  T.data[q].i=M.data[p].j;</p><p>  T.dat

27、a[q].j=M.data[p].i;</p><p>  T.data[q].e=M.data[p].e;</p><p><b>  q++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p> 

28、 int Compare(int a1,int b1,int a2,int b2)</p><p><b>  {</b></p><p>  if(a1>a2)return 1;</p><p>  else if(a1<a2)</p><p>  return -1;</p><p&g

29、t;  else if(b1>b2)</p><p><b>  return 1;</b></p><p><b>  if(b1<b2)</b></p><p>  return -1;</p><p><b>  else</b></p><

30、;p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  6.2 三元組減法</b></p><p>  用戶再輸入一個稀疏矩陣,系統(tǒng)將兩個矩陣進行加運算并得出結(jié)果。</p><p>  void AddTMatix

31、(TSMatrix M,TSMatrix T,TSMatrix &S)//三元組相加</p><p><b>  {</b></p><p>  S.mu=M.mu>T.mu?M.mu:T.mu;</p><p>  S.nu=M.nu>T.nu?M.nu:T.nu;</p><p><b>

32、;  S.tu=0;</b></p><p><b>  int ce;</b></p><p>  int q=1;int mcount=1,tcount=1;</p><p>  while(mcount<=M.tu&&tcount<=T.tu)</p><p><b&g

33、t;  {</b></p><p>  switch(Compare(M.data[mcount].i,M.data[mcount].j,T.data[tcount].i,T.data[tcount].j))</p><p><b>  {</b></p><p><b>  case -1: </b><

34、/p><p>  S.data[q].e=M.data[mcount].e;</p><p>  S.data[q].i=M.data[mcount].i;</p><p>  S.data[q].j=M.data[mcount].j;</p><p><b>  q++;</b></p><p> 

35、 mcount++; </p><p><b>  break;</b></p><p><b>  case 1: </b></p><p>  S.data[q].e=T.data[tcount].e;</p><p>  S.data[q].i=T.data[tcount].i;</p&

36、gt;<p>  S.data[q].j=T.data[tcount].j;</p><p><b>  q++;</b></p><p>  tcount++; </p><p><b>  break;</b></p><p><b>  case 0: </b&g

37、t;</p><p>  ce=M.data[mcount].e+T.data[tcount].e;</p><p><b>  if(ce)</b></p><p><b>  {</b></p><p>  S.data[q].e=ce;</p><p>  S.data

38、[q].i=M.data[mcount].i;</p><p>  S.data[q].j=M.data[mcount].j;</p><p><b>  q++;</b></p><p><b>  mcount++;</b></p><p><b>  tcount++;</b&

39、gt;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  mcount++;</b></p><p><b>  tc

40、ount++;</b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  whi

41、le(mcount<=M.tu)</p><p><b>  {</b></p><p>  S.data[q].e=M.data[mcount].e;</p><p>  S.data[q].i=M.data[mcount].i;</p><p>  S.data[q].j=M.data[mcount].j;&l

42、t;/p><p><b>  q++;</b></p><p><b>  mcount++;</b></p><p><b>  }</b></p><p>  while(tcount<=M.tu)</p><p><b>  {<

43、/b></p><p>  S.data[q].e=T.data[tcount].e;</p><p>  S.data[q].i=T.data[tcount].i;</p><p>  S.data[q].j=T.data[tcount].j;</p><p><b>  q++;</b></p>

44、<p>  tcount++; </p><p><b>  }</b></p><p><b>  S.tu=q-1;</b></p><p><b>  }…</b></p><p><b>  6.3三元組的減法</b></p>

45、<p>  用戶再輸入一個稀疏矩陣,系統(tǒng)將兩個矩陣進行加運、減算并得出結(jié)果。</p><p>  void jianTMatix(TSMatrix M,TSMatrix T,TSMatrix &S)//三元組相減</p><p><b>  {</b></p><p>  S.mu=M.mu>T.mu?M.mu:T.

46、mu;</p><p>  S.nu=M.nu>T.nu?M.nu:T.nu;</p><p><b>  S.tu=0;</b></p><p><b>  int ce;</b></p><p>  int q=1;int mcount=1,tcount=1;</p><

47、;p>  while(mcount<=M.tu&&tcount<=T.tu)</p><p><b>  {</b></p><p>  switch(Compare(M.data[mcount].i,M.data[mcount].j,T.data[tcount].i,T.data[tcount].j))</p><

48、;p><b>  {</b></p><p><b>  case -1: </b></p><p>  S.data[q].e=M.data[mcount].e;</p><p>  S.data[q].i=M.data[mcount].i;</p><p>  S.data[q].j=M.

49、data[mcount].j;</p><p><b>  q++;</b></p><p>  mcount++; </p><p><b>  break;</b></p><p><b>  case 1: </b></p><p>  S.dat

50、a[q].e=-T.data[tcount].e;</p><p>  S.data[q].i=T.data[tcount].i;</p><p>  S.data[q].j=T.data[tcount].j;</p><p><b>  q++;</b></p><p>  tcount++; </p>

51、<p><b>  break;</b></p><p><b>  case 0: </b></p><p>  ce=M.data[mcount].e-T.data[tcount].e;</p><p><b>  if(ce)</b></p><p><b

52、>  {</b></p><p>  S.data[q].e=ce;</p><p>  S.data[q].i=M.data[mcount].i;</p><p>  S.data[q].j=M.data[mcount].j;</p><p><b>  q++;</b></p><

53、;p><b>  mcount++;</b></p><p><b>  tcount++;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b>&

54、lt;/p><p><b>  mcount++;</b></p><p><b>  tcount++;</b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b&g

55、t;  }</b></p><p><b>  }</b></p><p>  while(mcount<=M.tu)</p><p><b>  {</b></p><p>  S.data[q].e=M.data[mcount].e;</p><p> 

56、 S.data[q].i=M.data[mcount].i;</p><p>  S.data[q].j=M.data[mcount].j;</p><p><b>  q++;</b></p><p><b>  mcount++;</b></p><p><b>  }</b&g

57、t;</p><p>  while(tcount<=M.tu)</p><p><b>  {</b></p><p>  S.data[q].e=-T.data[tcount].e;</p><p>  S.data[q].i=T.data[tcount].i;</p><p>  S.

58、data[q].j=T.data[tcount].j;</p><p><b>  q++;</b></p><p>  tcount++; </p><p><b>  }</b></p><p><b>  S.tu=q-1;</b></p><p>

59、;<b>  }</b></p><p><b>  6.4三元組的乘法</b></p><p>  用戶再輸入一個稀疏矩陣,系統(tǒng)將其進行乘法運算并得出結(jié)果。</p><p>  int MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q) //三元組相乘</p&

60、gt;<p><b>  {</b></p><p>  int arow,brow,ccol,i,t,ctemp[100],p,q,tp;</p><p>  if(M.nu != N.mu) </p><p><b>  return 0;</b></p><p>  Q.mu=M

61、.mu;</p><p>  Q.nu =N.nu;</p><p><b>  Q.tu =0;</b></p><p>  if(M.tu*N.tu!=0)</p><p><b>  {</b></p><p>  for(arow=1;arow<=M.mu;++

62、arow)</p><p><b>  {</b></p><p>  for(i=0;i<=N.nu;++i) </p><p>  ctemp[i]=0;</p><p>  Q.rpos[arow]=Q.tu+1;</p><p>  if(arow<M.mu) </p&g

63、t;<p>  tp=M.rpos[arow+1];</p><p><b>  else </b></p><p>  tp=M.tu+1;</p><p>  for(p=M.rpos[arow];p<tp;++p)</p><p><b>  {</b></p>

64、<p>  brow=M.data[p].j; </p><p>  if(brow<N.mu) </p><p>  t=N.rpos[brow+1];</p><p><b>  else </b></p><p><b>  t=N.tu+1;</b></p>

65、<p>  for(q=N.rpos[brow];q<t ++q)</p><p><b>  {</b></p><p>  ccol=N.data[q].j; </p><p>  ctemp[ccol]+=M.data[p].e*N.data[q].e;</p><p><b>  }&

66、lt;/b></p><p><b>  }</b></p><p>  for(ccol=1;ccol<=Q.nu;++ccol) </p><p><b>  {</b></p><p>  if(ctemp[ccol])</p><p><b> 

67、 {</b></p><p>  if(++(Q.tu)>maxsize) </p><p><b>  return 1;</b></p><p>  Q.data[Q.tu].i=arow,Q.data[Q.tu].j=ccol,Q.data[Q.tu].e=ctemp[ccol]; </p><p&g

68、t;<b>  } </b></p><p><b>  }</b></p><p><b>  } </b></p><p><b>  }</b></p><p><b>  return 1;</b></p>&l

69、t;p><b>  }</b></p><p>  6.5 十字鏈表的轉(zhuǎn)置</p><p>  void TurnSMatrix_OL(CrossList &M) //十字鏈表轉(zhuǎn)置</p><p><b>  {</b></p><p>  int col,row;</p&g

70、t;<p>  OLink p,q;</p><p>  for(col=1;col<=M.mu;col++)</p><p><b>  {</b></p><p>  q=p=M.rhead[col];</p><p><b>  while(q)</b></p>

71、<p><b>  {</b></p><p><b>  row=p->i;</b></p><p>  p->i=p->j;</p><p><b>  p->j=row;</b></p><p>  q=p->right;<

72、;/p><p>  p->right=p->down;</p><p>  p->down=q;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>

73、<p>  6.6 十字鏈表的加法</p><p>  int SMatrix_ADD(CrossList *A,CrossList *B) //十字鏈表相加</p><p><b>  {</b></p><p>  OLNode *pa,*pb,*pre,*p,*cp[100];</p><p>  i

74、nt i,j,t;</p><p>  t=A->tu+B->tu;</p><p>  for(j=1;j<=A->nu;j++)</p><p>  cp[j]=A->chead[j];</p><p>  for(i=1;i<=A->mu;i++)</p><p><

75、;b>  {</b></p><p>  pa=A->rhead[i];</p><p>  pb=B->rhead[i];</p><p><b>  pre=NULL;</b></p><p><b>  while(pb)</b></p><p

76、><b>  {</b></p><p>  if(pa==NULL||pa->j>pb->j)</p><p><b>  {</b></p><p>  p=(OLink)malloc(sizeof(OLNode));</p><p><b>  if(!pre

77、)</b></p><p>  A->rhead[i]=p;</p><p><b>  else</b></p><p>  pre->right=p;</p><p>  p->right=pa;</p><p><b>  pre=p;</b&g

78、t;</p><p><b>  p->i=i;</b></p><p>  p->j=pb->j;</p><p>  p->e=pb->e;</p><p>  if(!A->chead[p->j])</p><p><b>  {</

79、b></p><p>  A->chead[p->j]=cp[p->j]=p;</p><p>  p->down=NULL;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>

80、;  {</b></p><p>  cp[p->j]->down=p;</p><p>  cp[p->j]=p;</p><p><b>  }</b></p><p>  pb=pb->right;</p><p><b>  }</b&g

81、t;</p><p>  else if(pa->j<pb->j)</p><p><b>  {</b></p><p><b>  pre=pa;</b></p><p>  pa=pa->right;</p><p><b>  }&l

82、t;/b></p><p>  else if(pa->e+pb->e)</p><p><b>  {</b></p><p><b>  t--;</b></p><p>  pa->e+=pb->e;</p><p><b>  

83、pre=pa;</b></p><p>  pa=pa->right;</p><p>  pb=pb->right;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  { &l

84、t;/b></p><p><b>  t=t-2;</b></p><p><b>  if(!pre)</b></p><p>  A->rhead[i]=pa->right;</p><p><b>  else</b></p><p

85、>  pre->right=pa->right;</p><p><b>  p=pa;</b></p><p>  pa=pa->right;</p><p>  if(A->chead[p->j]==p)</p><p>  A->chead[p->j]=cp[p-&g

86、t;j]=p->down;</p><p><b>  else </b></p><p>  cp[p->j]->down=p->down;</p><p><b>  free(p);</b></p><p>  pb=pb->right;</p>&

87、lt;p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  A->mu=A->mu>B->mu?A->mu:B->mu;</p><p>  A->nu=A

88、->nu>B->nu?A->nu:B->nu;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p>  6.7十字鏈表的減法</p><p>  int SMatrix_jian(CrossList *A,Cr

89、ossList *B) //十字鏈表相減</p><p><b>  {</b></p><p>  OLNode *pa,*pb,*pre,*p,*cp[100];</p><p>  int i,j,t;</p><p>  t=A->tu+B->tu;</p><p>  f

90、or(j=1;j<=A->nu;j++)</p><p>  cp[j]=A->chead[j];</p><p>  for(i=1;i<=A->mu;i++)</p><p><b>  {</b></p><p>  pa=A->rhead[i];</p><

91、p>  pb=B->rhead[i];</p><p><b>  pre=NULL;</b></p><p><b>  while(pb)</b></p><p><b>  {</b></p><p>  if(pa==NULL||pa->j>pb

92、->j)</p><p><b>  {</b></p><p>  p=(OLink)malloc(sizeof(OLNode));</p><p><b>  if(!pre)</b></p><p>  A->rhead[i]=p;</p><p><

93、b>  else</b></p><p>  pre->right=p;</p><p>  p->right=pa;</p><p><b>  pre=p;</b></p><p><b>  p->i=i;</b></p><p> 

94、 p->j=pb->j;</p><p>  p->e=-pb->e;</p><p>  if(!A->chead[p->j])</p><p><b>  {</b></p><p>  A->chead[p->j]=cp[p->j]=p;</p>

95、<p>  p->down=NULL;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  cp[p->j]->down=p;</p><

96、;p>  cp[p->j]=p;</p><p><b>  }</b></p><p>  pb=pb->right;</p><p><b>  }</b></p><p>  else if(pa->j<pb->j)</p><p>

97、<b>  {</b></p><p><b>  pre=pa;</b></p><p>  pa=pa->right;</p><p><b>  }</b></p><p>  else if(pa->e-pb->e)</p><p&

98、gt;<b>  {</b></p><p><b>  t--;</b></p><p>  pa->e-=pb->e;</p><p><b>  pre=pa;</b></p><p>  pa=pa->right;</p><p&g

99、t;  pb=pb->right;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  { </b></p><p><b>  t=t-2;</b></p><p&g

100、t;<b>  if(!pre)</b></p><p>  A->rhead[i]=pa->right;</p><p><b>  else</b></p><p>  pre->right=pa->right;</p><p><b>  p=pa;</

101、b></p><p>  pa=pa->right;</p><p>  if(A->chead[p->j]==p)</p><p>  A->chead[p->j]=cp[p->j]=p->down;</p><p><b>  else </b></p>

102、<p>  cp[p->j]->down=p->down;</p><p><b>  free(p);</b></p><p>  pb=pb->right;</p><p><b>  }</b></p><p><b>  }</b>&l

103、t;/p><p><b>  }</b></p><p>  A->mu=A->mu>B->mu?A->mu:B->mu;</p><p>  A->nu=A->nu>B->nu?A->nu:B->nu;</p><p><b>  retur

104、n 1;</b></p><p><b>  }</b></p><p>  6.8十字鏈表的乘法</p><p>  int MultSMatrix_OL(CrossList M, CrossList N, CrossList &Q) //十字鏈表相乘</p><p><b>  {&l

105、t;/b></p><p>  int i, j, e; </p><p>  OLink p0, q0, p, pl, pla; </p><p>  if(M.nu!=N.mu)//檢查稀疏矩陣M的列數(shù)和N的行數(shù)是否對應(yīng)相等</p><p><b>  {</b></p><p>  p

106、rintf( "稀疏矩陣A的列數(shù)和B的行數(shù)不相等,不能相乘。\n" );</p><p>  return 0; </p><p><b>  }</b></p><p>  Q.mu=M.mu;</p><p>  Q.nu=N.nu;</p><p><b>  

107、Q.tu=0;</b></p><p>  if(!(Q.rhead=(OLink*)malloc((Q.mu+1)*sizeof(OLink))))</p><p><b>  exit(-2);</b></p><p>  if(!(Q.chead=(OLink*)malloc((Q.nu+1)*sizeof(OLink))))

108、 </p><p><b>  exit(-2);</b></p><p>  for(i=1;i<=Q.mu;i++)</p><p>  Q.rhead[i] = NULL;</p><p>  for(i=1;i<=Q.nu;i++) </p><p>  Q.chead[i]=

109、NULL;</p><p>  for(i=1;i<=Q.mu;i++) //相乘</p><p>  for(j=1;j<=Q.nu;j++)</p><p><b>  {</b></p><p>  p0 = M.rhead[i];</p><p>  q0 = N.c

110、head[j];</p><p><b>  e = 0;</b></p><p>  while(p0&&q0)//M第i行和N第j列有元素</p><p><b>  {</b></p><p>  if( p0->j > q0->i) </p>

111、<p>  q0 = q0->down; //M的列大于N的行,則N的列指針后移</p><p>  else if(p0->j < q0->i) </p><p>  p0 = p0->right;//M的列小于N的行,則M的行指針右移</p><p>  else //M的行等于N的列</p><p&g

112、t;<b>  {</b></p><p>  e += p0->e * q0->e; //乘積累加</p><p>  q0 = q0->down, p0 = p0->right;//移動指針</p><p><b>  }</b></p><p><b>  }

113、</b></p><p>  if(e)//乘積不為0</p><p><b>  {</b></p><p>  if(!(p = (OLink)malloc(sizeof(OLNode)))) </p><p><b>  exit(-2);</b></p><p

114、>  Q.tu++;//非零元素增加</p><p><b>  p->i=i;</b></p><p><b>  p->j=j;</b></p><p><b>  p->e=e;</b></p><p>  p->right=NULL;<

115、;/p><p>  p->down=NULL;//賦值,指針后移,將p插入十字鏈表 行插入</p><p>  if(Q.rhead[i]==NULL) //若p為該行的第1個結(jié)點</p><p>  Q.rhead[i]=p =p; //p插在該行的表頭且pl指向p(該行的最后一個結(jié)點)</p><p><b>  else

116、</b></p><p>  pl->right=p,pl=p; //插在pl所指結(jié)點之后,pl右移 列插入</p><p>  if(Q.chead[j] == NULL) //若p為該列的第一個結(jié)點</p><p>  Q.chead[j] = p; //該列的表頭指向p</p><p><b>  else

117、</b></p><p><b>  {</b></p><p><b>  //插在列表尾</b></p><p>  pla = Q.chead[j];//pla指向j行的第1個結(jié)點</p><p>  while(pla->down)</p><p>

118、  pla = pla->down;//pla指向j行最后一個結(jié)點</p><p>  pla->down = p; </p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>&l

119、t;p><b>  return 1;</b></p><p><b>  }</b></p><p><b>  7 系統(tǒng)測試</b></p><p>  首先進入VC++6.0,打開“稀疏矩陣應(yīng)用.cpp”,編譯后執(zhí)行文件,按系統(tǒng)提示操作。</p><p><b

120、>  7.1三元組的轉(zhuǎn)置</b></p><p>  三元組的轉(zhuǎn)置,實現(xiàn)。</p><p>  7.2 三元組的加法</p><p>  三元組的加法,實現(xiàn)。</p><p>  7.3 三元組的減法</p><p>  三元組的減法,實現(xiàn)。</p><p>  7.4 三元組

121、的乘法</p><p>  三元組的乘法,實現(xiàn)。</p><p>  7.5 十字鏈表的轉(zhuǎn)置</p><p>  十字鏈表的轉(zhuǎn)置,實現(xiàn)。</p><p>  7.6十字鏈表的加法</p><p>  十字鏈表的加法,實現(xiàn)。</p><p>  7.7 十字鏈表的減法</p><

122、;p>  十字鏈表的減法,實現(xiàn)。</p><p>  7.8 十字鏈表的乘法</p><p>  十字鏈表的乘法,實現(xiàn)。</p><p><b>  7.9總結(jié)</b></p><p>  通過上述測試,本系統(tǒng)實現(xiàn)了三元組和十字鏈表的轉(zhuǎn)置、加、減、乘功能,且實現(xiàn)各個功能的時間復(fù)雜度均為 n平方。</p>

123、<p><b>  8結(jié)論</b></p><p>  通過上述測試,本系統(tǒng)用C語言在VC++6.0的平臺上進行編程,實現(xiàn)了三元組和十字鏈表的轉(zhuǎn)置、加、減、乘功能。</p><p>  在進行稀疏矩陣的相加時,用十字鏈表更方便;進行相乘時,用三元組更方便。</p><p><b>  參考文獻</b><

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論