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ù)據(jù)結(jié)構(gòu)</b></p><p><b>  課程設(shè)計報告</b></p><p>  設(shè)計題目:稀疏矩陣運(yùn)算器</p><p>  班 級 計科112班 </p><p>  學(xué) 號

2、 </p><p>  姓 名 </p><p>  指導(dǎo)教師 </p><p>  起止時間 2013.10.14—2013.10.18 </p><p>  成 績

3、 </p><p>  2013—2014 年 一 學(xué)期</p><p><b>  一、實驗?zāi)康?</b></p><p>  通過實習(xí),了解并初步掌握設(shè)計、實現(xiàn)較大系統(tǒng)的完整過程,包括系統(tǒng)分析、編碼設(shè)計、系統(tǒng)集成、以及調(diào)試分析,熟練掌握數(shù)據(jù)結(jié)構(gòu)的選擇、設(shè)計、實現(xiàn)以及操作方法,為進(jìn)一步的應(yīng)

4、用開發(fā)打好基礎(chǔ)。</p><p><b>  問題描述</b></p><p>  稀疏矩陣是指那些多數(shù)元素為零的矩陣。利用“稀疏”特點進(jìn)行存儲和計算可以大大節(jié)省存儲空間,提高計算效率。實現(xiàn)一個能進(jìn)行稀疏矩陣基本運(yùn)算的運(yùn)算器。</p><p><b>  條件分析</b></p><p>  以“帶

5、行邏輯鏈接信息”的三元組順序表表示稀疏矩陣,實現(xiàn)矩陣轉(zhuǎn)置,求逆,實現(xiàn)兩個矩陣相加、相減和相乘的運(yùn)算。稀疏矩陣的輸入形式采用三元組表示,而運(yùn)算結(jié)果的矩陣則以通常的陣列形式列出。 </p><p>  演示程序以用戶和計算機(jī)的對話方式執(zhí)行,數(shù)組的建立方式為邊輸入邊建立。</p><p>  由題目要求可知:首先應(yīng)輸入矩陣的行數(shù)和列數(shù),并判別給出的兩個矩陣的行、列數(shù)對于所要求作的運(yùn)算是否相匹配。

6、</p><p>  程序可以對三元組的輸入順序不加以限制;根據(jù)對矩陣的行列,三元組作直接插入排序,從而進(jìn)行運(yùn)算時,不會產(chǎn)生錯誤。</p><p>  在用三元組表示稀疏矩陣時,相加、乘積和相減所得結(jié)果矩陣應(yīng)該另生成;矩陣求逆時,為了算法方便,使用二維數(shù)組存放。 </p><p><b>  測試數(shù)據(jù)如下:</b></p><

7、;p>  10 0 0 0 0 0 10 0 0</p><p>  0 0 0 + 0 0 -1 = 0 0 8</p><p>  -1 0 0 1 0 -3 0 0 -3</p><p>  10 0 0 0 10 0<

8、;/p><p>  0 9 - 0 -1 = 0 10 </p><p>  -1 0 1 -3 -2 3</p><p>  1 0 0 1 0 1 0</p><p>  0 2 0 × 0 0

9、 = 0 0</p><p>  0 0 3 1 0 3 0</p><p><b>  概要設(shè)計</b></p><p>  抽象數(shù)據(jù)類型稀疏矩陣的定義如下:</p><p>  ADT SparseMatrix{</p><p>

10、;  數(shù)據(jù)對象:D={aij|i=1,2,…,m; j=1,2,…,n;</p><p>  aij∈ElemSet, m和n分別為矩陣的行數(shù)和列數(shù)}</p><p>  數(shù)據(jù)關(guān)系:R={Row,Colum }</p><p>  Row={﹤ai,j, ai,j+1﹥| 1≤i≤m, 1≤j≤n-1}</p><p>  Colum =

11、{﹤ai,j, ai+1,j﹥| 1≤i≤m-1, 1≤j≤n}</p><p><b>  基本操作:</b></p><p>  creat_matrix(crosslist TM)</p><p>  操作結(jié)果:創(chuàng)建稀疏矩陣矩陣TM</p><p>  print_matrix(crosslist TM)<

12、/p><p>  初始條件:稀疏矩陣TM存在</p><p>  操作結(jié)果:通常形式輸出稀疏矩陣</p><p>  add_matrix(crosslist A,crosslist B,crosslist &C) </p><p>  初始條件:稀疏矩陣A,B和C存在</p><p>  操作結(jié)果:稀疏矩陣

13、的加法運(yùn)算:C=A+B</p><p>  sub_matrix(crosslist A,crosslist B,crosslist &C)</p><p>  初始條件:稀疏矩陣A,B和C存在</p><p>  操作結(jié)果:稀疏矩陣的減法運(yùn)算:C=A-B</p><p>  multi_matrix(crosslist A,cros

14、slist B,crosslist &C)</p><p>  初始條件:稀疏矩陣A,B和C存在</p><p>  操作結(jié)果:稀疏矩陣的乘法運(yùn)算:C=A×B </p><p>  }ADT SparseMatrix;</p><p><b>  2.主程序:</b></p><

15、;p>  void main( )</p><p><b>  {初始化;</b></p><p><b>  do {</b></p><p><b>  接受命令;</b></p><p><b>  選擇處理命令;</b></p>

16、<p><b>  }</b></p><p>  while(命令!=“退出”)</p><p>  3.本程序有四個模塊,調(diào)用關(guān)系如下:</p><p><b>  主程序模塊</b></p><p><b>  創(chuàng)建矩陣模塊</b></p>&l

17、t;p><b>  矩陣運(yùn)算模塊</b></p><p><b>  矩陣輸出模塊</b></p><p><b>  程序設(shè)計</b></p><p><b>  1、矩陣的定義</b></p><p>  typedef struct list&

18、lt;/p><p>  { int row; </p><p>  int colum;</p><p>  int value; </p><p>  struct list *right;</p><p>  struct list *down;</p><p>  

19、}node,*element;</p><p>  typedef struct link</p><p>  { int row_size;//矩陣的行數(shù)</p><p>  int colum_size;//矩陣的列數(shù)</p><p>  int non_zero_amount;//非零元素的個數(shù)</p><p&

20、gt;  element *rhead;//行鏈表頭指針基址</p><p>  element *chead;//列鏈表頭指針基址</p><p>  }crosslist;</p><p>  2、基本操作設(shè)定為:</p><p>  稀疏矩陣的基本操作設(shè)置如下:</p><p>  int creat_matri

21、x(crosslist &one);//用十字鏈表創(chuàng)建稀疏矩陣</p><p>  int print_matrix(crosslist &one) //輸出稀疏矩陣</p><p>  int add_matrix(crosslist one,crosslist two,crosslist &three) //加法運(yùn)算</p><

22、p>  int sub_matrix(crosslist M,crosslist N,crosslist &Q) //矩陣相減</p><p>  int multi_matrix(crosslist one,crosslist two,crosslist &three) //矩陣相乘</p><p>  int main(void) //主

23、函數(shù)</p><p><b>  函數(shù)的調(diào)用關(guān)系圖 </b></p><p><b>  六、測試結(jié)果 </b></p><p>  1.按題目測試要求輸入:</p><p><b> ?。?)程序主頁面</b></p><p><b> 

24、?。?)矩陣相加</b></p><p><b> ?。?)矩陣相減</b></p><p><b> ?。?)矩陣相乘</b></p><p><b>  (5)退出系統(tǒng)</b></p><p><b>  結(jié)果分析</b></p>

25、;<p>  本次作業(yè)中,稀疏矩陣在書本有較詳細(xì)的說明,給予了本次作業(yè)一個較大的幫助。</p><p>  整個程序主要運(yùn)用了矩陣運(yùn)算的規(guī)則,利用創(chuàng)建矩陣,分析數(shù)據(jù),行列是否匹配,矩陣運(yùn)算,矩陣輸出。</p><p>  整個程序運(yùn)行期間不是實行動態(tài)存儲管理,故占用空間比較大;特別是執(zhí)行稀疏矩陣的求逆過程。</p><p>  主要算法的時空分析:&l

26、t;/p><p>  加法,減法和乘法時間復(fù)雜度為:O(m×n)。</p><p><b>  參考資料</b></p><p>  《數(shù)據(jù)結(jié)構(gòu)》(C語言版)——清華大學(xué)出版社; 作者: 嚴(yán)蔚敏、吳偉民;</p><p>  《數(shù)據(jù)結(jié)構(gòu)題集》(C語言版)——清華大學(xué)出版社; 作者: 嚴(yán)蔚敏、吳偉民、米寧

27、</p><p>  《程序設(shè)計題典》(C語言版)——清華大學(xué)出版社; 作者: 李春葆</p><p><b>  附源程序:</b></p><p>  //用十字鏈表創(chuàng)建稀疏矩陣,求矩陣的加,減,乘,并且矩陣的輸入輸出都以常規(guī)矩陣形式</p><p>  #include <stdio.h></p

28、><p>  #include <stdlib.h></p><p>  #include <assert.h></p><p>  #include <windows.h></p><p>  #define OVERFLOW -1</p><p>  #define OK 1

29、</p><p>  #define ERROR 0</p><p>  typedef struct list</p><p>  { int row; </p><p>  int colum;</p><p>  int value; </p><p>  s

30、truct list *right;</p><p>  struct list *down;</p><p>  }node,*element;</p><p>  typedef struct link</p><p>  { int row_size; //矩陣的行數(shù)</p><p>

31、;  int colum_size; //矩陣的列數(shù)</p><p>  int non_zero_amount; //非零元素的個數(shù)</p><p>  element *rhead; //行鏈表頭指針基址</p><p>  element *chead; //列鏈表頭指針基址</p><p>  }

32、crosslist;</p><p>  int init_matrix(crosslist &one) //矩陣的初始化 </p><p><b>  {</b></p><p>  one.row_size=0;</p><p>  one.colum_size=0;

33、 </p><p>  one.non_zero_amount=0;</p><p>  one.rhead=NULL;</p><p>  one.chead=NULL;</p><p>  return OK;

34、 </p><p><b>  }</b></p><p>  int crea

35、t_matrix(crosslist &one) //用十字鏈表創(chuàng)建稀疏矩陣 </p><p><b>  {</b></p><p>  int m,n,t,i,j,k,a;</p><p>  element p,q;</p><p>  if(one.rhead)</p><

36、p><b>  {</b></p><p>  one.rhead=NULL;</p><p>  one.chead=NULL;</p><p>  one.row_size=0;</p><p>  one.colum_size=0;</p><p>  one.non_zero_amo

37、unt=0;</p><p><b>  }</b></p><p>  printf("\n請輸入稀疏矩陣的行數(shù) 列數(shù) 非零元個數(shù):");</p><p>  scanf("%d %d %d",&m,&n,&t);</p><p>  one.row_

38、size=m;</p><p>  one.colum_size=n;</p><p>  one.non_zero_amount=t;</p><p>  if(!(one.rhead=(element *)malloc((m+1)*sizeof(element))))exit(OVERFLOW); //分配單元</p><p>  

39、if(!(one.chead=(element *)malloc((n+1)*sizeof(element))))exit(OVERFLOW);</p><p>  for(i=1;i<=one.row_size+1;i++)</p><p><b>  {</b></p><p>  one.rhead[i]=NULL;</p&g

40、t;<p><b>  }</b></p><p>  for(i=1;i<=one.colum_size+1;i++)</p><p><b>  {</b></p><p>  one.chead[i]=NULL; </p><p><b>  }</

41、b></p><p>  for(k=1;k<=one.non_zero_amount;k++)</p><p><b>  {</b></p><p>  printf("\n請輸入第%d個非零元的行號 列號 非零元素值:",k);</p><p>  scanf("%d %d

42、 %d",&i,&j,&a);</p><p>  if(!(p=(list *)malloc(sizeof(list))))exit(OVERFLOW);</p><p><b>  p->row=i;</b></p><p>  p->colum=j;</p><p> 

43、 p->value=a; // 生成結(jié)點</p><p>  if(one.rhead[i]==NULL||one.rhead[i]->colum>j)</p><p><b>  {</b></p><p>  p->right=one.rhead[i]; </p><p>

44、;  one.rhead[i]=p;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  for(q=one.rhead[i];(q->right)&&q->

45、;right->colum<j;q=q->right);</p><p>  p->right=q->right;</p><p>  q->right=p; //尋找在行中的插入位置</p><p><b>  }</b></p><p>  if(one.chead[j

46、]==NULL||one.chead[j]->row>i)</p><p><b>  {</b></p><p>  p->down=one.chead[j];</p><p>  one.chead[j]=p;</p><p><b>  }</b></p>&l

47、t;p><b>  else</b></p><p><b>  {</b></p><p>  for(q=one.chead[j];(q->down)&&q->down->row<i;q=q->down);</p><p>  p->down=q->dow

48、n;</p><p>  q->down=p; //尋找在列中的插入位置</p><p><b>  }</b></p><p><b>  }</b></p><p>  return(0);</p><p>  }//輸出十字鏈表的函數(shù) </p>

49、;<p>  int print_matrix(crosslist &one) //打印出稀疏矩陣</p><p><b>  {</b></p><p><b>  int i,j;</b></p><p><b>  int b=0;</b></p>

50、<p>  element p;</p><p>  for(i=1;i<=one.row_size;i++)</p><p><b>  {</b></p><p>  p=one.rhead[i];</p><p>  printf("\t\t\t\t ");</p>

51、;<p>  for(j=1;j<=one.colum_size;j++)</p><p><b>  { </b></p><p>  if(p!=NULL)</p><p><b>  {</b></p><p>  if(j==p->colum)</p&g

52、t;<p><b>  {</b></p><p>  printf("%4d",p->value );</p><p>  p=p->right;</p><p><b>  }</b></p><p><b>  else</b>

53、;</p><p>  printf("%4d",b);</p><p><b>  }</b></p><p><b>  else</b></p><p>  printf("%4d",b);</p><p><b>  

54、}</b></p><p>  printf(" \n");</p><p><b>  }</b></p><p>  return(0);</p><p><b>  }</b></p><p>  int add_matrix(cross

55、list one,crosslist two,crosslist &three) //加法運(yùn)算</p><p><b>  {</b></p><p>  /*兩個矩陣相加*/</p><p>  assert(one.row_size==two.row_size&&one.colum_size==two.col

56、um_size);</p><p>  int i,j; //作為計數(shù)的循環(huán)</p><p>  element insert; //結(jié)點插入</p><p>  element pone,ptwo;</p><p>  element prow;

57、 //行的最后一個結(jié)點</p><p>  element *pcolum; //行列的最后一個結(jié)點</p><p>  three.row_size=one.row_size;</p><p>  three.colum_size=one.colum_size;</p><p>  t

58、hree.non_zero_amount=0;</p><p>  three.rhead=(element*)malloc(sizeof(element)*(three.row_size+1));</p><p>  assert(three.rhead!=NULL);</p><p>  three.chead=(element*)malloc(sizeof(e

59、lement)*(three.colum_size+1));</p><p>  assert(three.chead!=NULL);</p><p>  pcolum=(element*)malloc(sizeof(element)*(three.colum_size+1));</p><p>  assert(pcolum!=NULL);</p>

60、<p>  for(i=1;i<=three.row_size;i++)</p><p>  three.rhead[i]=NULL;</p><p>  for(i=1;i<=three.colum_size;i++)</p><p>  three.chead[i]=NULL;</p><p>  for(i=1;i

61、<=three.colum_size;i++)</p><p>  pcolum[i]=NULL;</p><p>  /*給相加后的結(jié)果排序*/</p><p>  for(i=1;i<=one.row_size;i++)</p><p><b>  {</b></p><p>  

62、pone=one.rhead[i];</p><p>  ptwo=two.rhead[i]; </p><p>  while(pone!=NULL&&ptwo!=NULL)</p><p>  {//both have nodes in the same row</p><p>  if(pone->colum

63、<ptwo->colum) //第一個矩陣的列數(shù)較小</p><p><b>  {</b></p><p>  insert=(element)malloc(sizeof(node));</p><p>  assert(insert!=NULL);</p><p>  insert->r

64、ow=i;</p><p>  insert->colum=pone->colum;</p><p>  insert->value=pone->value;</p><p>  insert->right=NULL;</p><p>  pone=pone->right;</p><p

65、>  three.non_zero_amount++;</p><p><b>  }</b></p><p><b>  else </b></p><p>  if(pone->colum>ptwo->colum) //第二個矩陣的列數(shù)較小 </p><p><

66、;b>  {</b></p><p>  insert=(element)malloc(sizeof(node));</p><p>  assert(insert!=NULL);</p><p>  insert->row=i;</p><p>  insert->colum=ptwo->colum;&l

67、t;/p><p>  insert->value=ptwo->value;</p><p>  insert->right=NULL;</p><p>  ptwo=ptwo->right;</p><p>  three.non_zero_amount++;</p><p><b>  

68、}</b></p><p><b>  else</b></p><p>  if(pone->value+ptwo->value!=0)//相加后的結(jié)果是非零元素</p><p><b>  {</b></p><p>  insert=(element)malloc(si

69、zeof(node));</p><p>  assert(insert!=NULL);</p><p>  insert->row=i;</p><p>  insert->colum=ptwo->colum;</p><p>  insert->value=pone->value+ptwo->value

70、;</p><p>  insert->right=NULL;</p><p>  pone=pone->right;</p><p>  ptwo=ptwo->right;</p><p>  three.non_zero_amount++;</p><p><b>  }</b&g

71、t;</p><p>  else //相加結(jié)果是零</p><p><b>  {</b></p><p>  pone=pone->right;</p><p>  ptwo=ptwo->right;</p><p><

72、b>  continue;</b></p><p><b>  }</b></p><p>  if(three.rhead[i]==NULL)</p><p>  three.rhead[i]=prow=insert;</p><p><b>  else</b></p&g

73、t;<p><b>  {</b></p><p>  prow->right=insert;</p><p>  prow=insert;</p><p><b>  }</b></p><p>  if(three.chead[insert->colum]==NULL)

74、</p><p>  three.chead[insert->colum]=pcolum[insert->colum]=insert;</p><p><b>  else</b></p><p><b>  {</b></p><p>  pcolum[insert->colum

75、]->down=insert;</p><p>  pcolum[insert->colum]=insert;</p><p><b>  }</b></p><p><b>  }</b></p><p>  while(pone!=NULL) </p><p&

76、gt;<b>  {</b></p><p>  insert=(element)malloc(sizeof(node));</p><p>  assert(insert!=NULL);</p><p>  insert->row=i;</p><p>  insert->colum=pone->co

77、lum;</p><p>  insert->value=pone->value;</p><p>  insert->right=NULL;</p><p>  pone=pone->right; </p><p>  three.non_zero_amount++;&l

78、t;/p><p>  if(three.rhead[i]==NULL)</p><p>  three.rhead[i]=prow=insert;</p><p><b>  else</b></p><p><b>  {</b></p><p>  prow->righ

79、t=insert;</p><p>  prow=insert;</p><p><b>  }</b></p><p>  if(three.chead[insert->colum]==NULL)</p><p>  three.chead[insert->colum]=pcolum[insert->

80、colum]=insert;</p><p><b>  else</b></p><p><b>  {</b></p><p>  pcolum[insert->colum]->down=insert;</p><p>  pcolum[insert->colum]=inser

81、t;</p><p><b>  }</b></p><p><b>  }</b></p><p>  while(ptwo!=NULL)</p><p><b>  {</b></p><p>  insert=(element)malloc(siz

82、eof(node));</p><p>  assert(insert!=NULL);</p><p>  insert->row=i;</p><p>  insert->colum=ptwo->colum;</p><p>  insert->value=ptwo->value;</p><

83、;p>  insert->right=NULL;</p><p>  ptwo=ptwo->right; </p><p>  three.non_zero_amount++;</p><p>  if(three.rhead[i]==NULL)</p><p>  three.r

84、head[i]=prow=insert;</p><p><b>  else</b></p><p><b>  {</b></p><p>  prow->right=insert;</p><p>  prow=insert;</p><p><b> 

85、 }</b></p><p>  if(three.chead[insert->colum]==NULL)</p><p>  three.chead[insert->colum]=pcolum[insert->colum]=insert;</p><p><b>  else</b></p><

86、;p><b>  {</b></p><p>  pcolum[insert->colum]->down=insert;</p><p>  pcolum[insert->colum]=insert;</p><p><b>  }</b></p><p><b>

87、  } </b></p><p><b>  }</b></p><p>  three.non_zero_amount=three.non_zero_amount;</p><p>  for(j=1;j<=three.colum_size;j++)</p><p>  {

88、 if(pcolum[j]!=NULL)</p><p>  pcolum[j]->down=NULL;</p><p><b>  }</b></p><p>  free(pcolum);</p><p>  return OK;</p><p><b>

89、  }//矩陣相加結(jié)束</b></p><p>  int sub_matrix(crosslist M,crosslist N,crosslist &Q) //矩陣相減</p><p>  { // 初始條件: 稀疏矩陣M與N的行數(shù)和列數(shù)對應(yīng)相等</p><p>  /

90、/ 操作結(jié)果: 求稀疏矩陣的差Q=M-N </p><p><b>  int i,k;</b></p><p>  element p,pq,pm,pn;</p><p>  element *col;</p><p>  if(M.row_size!=N.row_size||M.colum_size!=N.colum

91、_size)</p><p><b>  {</b></p><p>  printf("兩個矩陣不是同類型的,不能相減\n");</p><p>  exit(OVERFLOW);</p><p><b>  }</b></p><p>  Q.row_

92、size=M.row_size; // 初始化Q矩陣 </p><p>  Q.colum_size=M.colum_size;</p><p>  Q.non_zero_amount=0; //元素個數(shù)的初值 </p><p>  Q.rhead=(element*)mall

93、oc((Q.row_size+1)*sizeof(element));</p><p>  if(!Q.rhead)</p><p>  exit(OVERFLOW);</p><p>  Q.chead=(element*)malloc((Q.colum_size+1)*sizeof(element));</p><p>  if(!Q.c

94、head)</p><p>  exit(OVERFLOW);</p><p>  for(k=1;k<=Q.row_size;k++) //初始化Q的行頭指針向量;各行鏈表為空鏈表</p><p>  Q.rhead[k]=NULL;</p><p>  for(k=1;k<=Q.colum_size;k++

95、) //初始化Q的列頭指針向量;各列鏈表為空鏈表 </p><p>  Q.chead[k]=NULL;</p><p>  col=(element*)malloc((Q.colum_size+1)*sizeof(element)); // 生成指向列的最后結(jié)點的數(shù)組 </p><p><b>  if(!col)</b>

96、;</p><p>  exit(OVERFLOW);</p><p>  for(k=1;k<=Q.colum_size;k++) // 賦初值 </p><p>  col[k]=NULL;</p><p>  for(i=1;i<=M.row_size;i++) //按行的順序相減 &l

97、t;/p><p><b>  {</b></p><p>  pm=M.rhead[i]; // pm指向矩陣M的第i行的第1個結(jié)點 </p><p>  pn=N.rhead[i]; // pn指向矩陣N的第i行的第1個結(jié)點 </p><p>  while(pm&a

98、mp;&pn) // pm和pn均不空 </p><p><b>  {</b></p><p>  if(pm->colum<pn->colum) // 矩陣M當(dāng)前結(jié)點的列小于矩陣N當(dāng)前結(jié)點的列 </p><p><b>  {</b></p&

99、gt;<p>  p=(element)malloc(sizeof(list)); // 生成矩陣Q的結(jié)點 </p><p><b>  if(!p)</b></p><p>  exit(OVERFLOW);</p><p>  Q.non_zero_amount++; // 非零元素數(shù)加&

100、lt;/p><p>  p->row=i; // 給結(jié)點賦值 </p><p>  p->colum=pm->colum;</p><p>  p->value=pm->value;</p><p>  p->right=NULL;</p><p>  

101、pm=pm->right; // pm指針向右移</p><p><b>  }</b></p><p>  else if(pm->colum>pn->colum) // 矩陣M當(dāng)前結(jié)點的列大于矩陣N當(dāng)前結(jié)點的列</p><p><b>  {</b>&

102、lt;/p><p>  p=(element)malloc(sizeof(list)); // 生成矩陣Q的結(jié)點 </p><p><b>  if(!p)</b></p><p>  exit(OVERFLOW);</p><p>  Q.non_zero_amount++; // 非零元素

103、數(shù)加1</p><p>  p->row=i; // 給結(jié)點賦值 </p><p>  p->colum=pn->colum;</p><p>  p->value=-pn->value;</p><p>  p->right=NULL;</p><p>

104、  pn=pn->right; // pn指針向右移 </p><p><b>  }</b></p><p>  else if(pm->value-pn->value) //矩陣M、N當(dāng)前結(jié)點的列相等且兩元素之差不為0</p><p><b>  {</b></

105、p><p>  p=(element)malloc(sizeof(list)); // 生成矩陣Q的結(jié)點 </p><p><b>  if(!p)</b></p><p>  exit(OVERFLOW);</p><p>  Q.non_zero_amount++; // 非零元素數(shù)

106、加1</p><p>  p->row=i; // 給結(jié)點賦值 </p><p>  p->colum=pn->colum;</p><p>  p->value=pm->value-pn->value;</p><p>  p->right=NULL;</p&

107、gt;<p>  pm=pm->right; // pm指針向右移 </p><p>  pn=pn->right; // pn指針向右移</p><p><b>  }</b></p><p>  else // 矩陣M、N當(dāng)前結(jié)

108、點的列相等且兩元素之差為0</p><p><b>  {</b></p><p>  pm=pm->right; // pm指針向右移 </p><p>  pn=pn->right; // pn指針向右移 </p><p><b>  continue;<

109、/b></p><p><b>  }</b></p><p>  if(Q.rhead[i]==NULL) // p為該行的第1個結(jié)點</p><p>  Q.rhead[i]=pq=p; // p插在該行的表頭且pq指向p(該行的最后一個結(jié)點)</p><p>  else

110、// 插在pq所指結(jié)點之后 </p><p><b>  {</b></p><p>  pq->right=p; // 完成行插入 </p><p>  pq=pq->right; // pq指向該行的最后一個結(jié)點</p><

111、;p><b>  }</b></p><p>  if(Q.chead[p->colum]==NULL) //p為該列的第1個結(jié)點 </p><p>  Q.chead[p->colum]=col[p->colum]=p; // p插在該列的表頭且col[p->j]指向p </p><

112、p>  else // 插在col[p->]所指結(jié)點之后 </p><p><b>  {</b></p><p>  col[p->colum]->down=p; // 完成列插入 </p><p>  col[p->

113、colum]=col[p->colum]->down; // col[p->j]指向該列的最后一個結(jié)點</p><p><b>  }</b></p><p><b>  }</b></p><p>  while(pm) // 將矩陣M該行的剩

114、余元素插入矩陣Q </p><p><b>  {</b></p><p>  p=(element)malloc(sizeof(list)); // 生成矩陣Q的結(jié)點 </p><p><b>  if(!p)</b></p><p>  exit(OVERFLOW);</p>&l

115、t;p>  Q.non_zero_amount++; // 非零元素數(shù)加1</p><p>  p->row=i; // 給結(jié)點賦值 </p><p>  p->colum=pm->colum;</p><p>  p->value=pm->value;&l

116、t;/p><p>  p->right=NULL;</p><p>  pm=pm->right; // pm指針向右移 </p><p>  if(Q.rhead[i]==NULL) // p為該行的第1個結(jié)點</p><p>  Q.rhead[i]=pq=p; // p插在該行的表頭且p

117、q指向p(該行的最后一個結(jié)點)</p><p>  else // 插在pq所指結(jié)點之后 </p><p><b>  {</b></p><p>  pq->right=p; // 完成行插入</p><p&g

118、t;  pq=pq->right; // pq指向該行的最后一個結(jié)點</p><p><b>  }</b></p><p>  if(Q.chead[p->colum]==NULL) // p為該列的第1個結(jié)點 </p><p>  Q.chead[p->colum

119、]=col[p->colum]=p; // p插在該列的表頭且col[p->j]指向p</p><p>  else // 插在col[p->j]所指結(jié)點之后 </p><p><b>  {</b></p><p>  col[p->colum]-&g

120、t;down=p; // 完成列插入 </p><p>  col[p->colum]=col[p->colum]->down; //col[p->j]指向該列的最后一個結(jié)點 </p><p><b>  }</b></p><p><b>  }</b></p&g

121、t;<p>  while(pn) // 將矩陣N該行的剩余元素插入矩陣Q </p><p><b>  {</b></p><p>  p=(element)malloc(sizeof(list)); // 生成矩陣Q的結(jié)點 </p><p><b>  if(!p)

122、</b></p><p>  exit(OVERFLOW);</p><p>  Q.non_zero_amount++; // 非零元素數(shù)加1</p><p>  p->row=i; // 給結(jié)點賦值 </p><p>  p->col

123、um=pn->colum;</p><p>  p->value=-pn->value;</p><p>  p->right=NULL;</p><p>  pn=pn->right; // pm指針向右移</p><p>  if(Q.rhead[i]==NULL) /

124、/ p為該行的第1個結(jié)點</p><p>  Q.rhead[i]=pq=p; // p插在該行的表頭且pq指向p(該行的最后一個結(jié)點) </p><p>  else //插在pq所指結(jié)點之后</p><p><b>  {</b></p><p>  pq->

125、;right=p; //完成行插入 </p><p>  pq=pq->right; // pq指向該行的最后一個結(jié)點 </p><p><b>  }</b></p><p>  if(Q.chead[p->colum]==NULL) // p為該列的第1個結(jié)點 </

126、p><p>  Q.chead[p->colum]=col[p->colum]=p; // p插在該列的表頭且col[p->j]指向p </p><p>  else // 插在col[p->j]所指結(jié)點之后 </p><p><b>  {</b>

127、;</p><p>  col[p->colum]->down=p; // 完成列插入 </p><p>  col[p->colum]=col[p->colum]->down; // col[p->j]指向該列的最后一個結(jié)點 </p><p><b>  }</b></p

128、><p><b>  }</b></p><p><b>  }</b></p><p>  for(k=1;k<=Q.colum_size;k++)</p><p>  if(col[k]) // k列有結(jié)點 </p><p>

129、  col[k]->down=NULL; // 令該列最后一個結(jié)點的down指針為空 </p><p>  free(col);</p><p>  return OK;</p><p><b>  }</b></p><p>  int multi_matrix(crosslist one,

130、crosslist two,crosslist &three) //矩陣相乘</p><p><b>  {</b></p><p>  /*把兩個矩陣相乘*/</p><p>  assert(one.colum_size==two.row_size);</p><p>  int i,j;//as

131、count in the loop</p><p>  int value;//temp total value</p><p>  element insert;//the node to insert into three</p><p>  element pone,ptwo;//use in traverse the node in one and two&

132、lt;/p><p>  element prow,pcolum;//mark the last row and colum node</p><p>  /*assignment*/</p><p>  three.row_size=one.row_size;</p><p>  three.colum_size=two.colum_size;&

133、lt;/p><p>  three.non_zero_amount=0; </p><p>  /*allocate memroy*/</p><p>  three.rhead=(element*)malloc(sizeof(element)*(three.row_size+1));</p><p>  assert(thre

134、e.rhead!=NULL);</p><p>  three.chead=(element*)malloc(sizeof(element)*(three.colum_size+1));</p><p>  assert(three.chead!=NULL); </p><p>  /*initialization*/</p><p&

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

最新文檔

評論

0/150

提交評論