實驗內容與要求
內容:
問題描述:從鍵盤輸入乙個稀疏矩陣a,稀疏矩陣的輸入形式採用三元組表示,然後進行快速轉置成b,輸出矩陣b。
要求:
n設計要求
首先設計乙個含有多個選單項的主控選單程式,然後再為這些選單項配上相應的功能。
1.三元組形式輸入稀疏矩陣a
2.輸出矩陣a(三元組形式)
3.a轉置為b
4. 輸出b
5.退出
請選擇1—5:
n功能要求
完成各選單的功能,能正確輸入稀疏矩陣,並能正確轉置。
n實現要求
1) 必須用vc++的引用或c語言用指標實現各功能的呼叫
n實驗提交要求
1) 實現功能的全部程式
2) 實驗必須於2018.5.11前提交電子版
n**程式
#include
#include
#include
#define ok 1
#define error 0
#define overflow 0
#define maxsize 100
#define maxrc 100
typedef int elemtype;
typedef struct
int i,j;
elemtype e;
}triple;
typedef struct
triple data[maxsize+1]; //非零元三元組
int rpos[maxrc+1]; //各行第乙個非零元的位置表
int mu,nu,tu; //矩陣的行數、列數和非零元個數
}rlsmatrix;
createsmatrix(rlsmatrix &m) //建立稀疏矩陣m
int i,m,n;
elemtype e;
int k,j;
printf("輸入矩陣的行數、列數、非零元的個數:");
scanf("%d%d%d",&m.mu,&m.nu,&m.tu);
m.data[0].i=0;
for(i=1;i<=m.tu;i++)
j=0;
doj++;
if(j>3) //控制跳出死迴圈,防止使用者無窮盡輸入資料
printf("本次輸入失敗!");
return error;
printf("按行序輸入第%d個非零元素所在的行(1~%d)列(1~%d)值:",i,m.mu,m.nu);//必須要按行序輸入
scanf("%d%d%d",&m,&n,&e);
k=0;
if(m<1||m>m.mu||n<1||n>m.nu) //行或列超出範圍
k=1;
if(mk=1;
}while(k);
m.data[i].i=m;
m.data[i].j=n;
m.data[i].e=e;
} //end for
printf("\n");
return(ok);
void destroysmatrix(rlsmatrix &m) //銷毀稀疏矩陣m
m.mu=0;
m.nu=0;
m.tu=0;
void prinrlsmatrix(rlsmatrix m) //遍歷稀疏矩陣 m
int i;
printf("稀疏矩陣對應的三元組表為:\n\n");
printf("行 列 元素值、\n\n");
for(i=1;i<=m.tu;i++)
printf("%2d%4d%8d\n",m.data[i].i,m.data[i].j,m.data[i].e);
printf("\n\n");
void print(rlsmatrix a) //列印矩陣函式,以通常形式輸出矩陣
int k=1,a,b;
printf("稀疏矩陣的通常形式為:\n");
int m[maxsize][maxsize];
for(a=0;afor(b=0;bm[a][b]=0;
while(k<=a.tu)
m[a.data[k].i-1][a.data[k].j-1]=a.data[k].e;
k++;
for(a=0;aprintf(" | ");
for(b=0;bprintf("%d ",m[a][b]);
printf(" | \n");
fasttransposesmatrix(rlsmatrix m,rlsmatrix &t) //快速轉置演算法
int p,q,t,col,*num,*cpot;
num=(int*)malloc((m.nu+1)*sizeof(int));
cpot=(int*)malloc((m.nu+1)*sizeof(int));
t.mu=m.nu;
t.nu=m.mu;
t.tu=m.tu;
if(t.tu)
for(col=1;col<=m.nu;++col)
num[col]=0;
for(t=1;t<=m.tu;++t)
++num[m.data[t].j];
cpot[1]=1;
for(col=2;col<=m.nu;++col)
cpot[col]=cpot[col-1]+num[col-1];
for(p=1;p<=m.tu;++p)
col=m.data[p].j;
q=cpot[col];
t.data[q].i=m.data[p].j;
t.data[q].j=m.data[p].i;
t.data[q].e=m.data[p].e;
++cpot[col];
free(num);
free(cpot);
return ok;
void welcome()
printf("****************************\n");
printf("* 1.三元組形式輸入稀疏矩陣a*\n");
printf("* 2.輸出矩陣a *\n");
printf("* 3.a轉置為b *\n");
printf("* 4.輸出b *\n");
printf("* 5.退出 *\n");
printf("****************************\n");
void main()
int result;
rlsmatrix a,b;
int i;
dowelcome(); //呼叫選單函式
scanf("%d",&i);
switch(i)
case 1:
printf("建立矩陣a:");
if((result=createsmatrix(a))==0)
exit(error);
break;
case 2:
prinrlsmatrix(a);
printf("\n");
print(a);
break;
case 3:
printf("a的轉置矩陣b(快速轉置):\n");
fasttransposesmatrix(a,b);
printf("快速轉置成功\n");
break;
case 4:
prinrlsmatrix(b);
printf("\n");
print(b);
destroysmatrix(a);
destroysmatrix(b);
break;
case 5:
break;
default:
printf("您的輸入有誤,請重新輸入");
break;
}while(i!=5);
稀疏矩陣演算法
1 稀疏矩陣的壓縮儲存 為了節省儲存單元,可只儲存非零元素。由於非零元素的分布一般是沒有規律的,因此在儲存非零元素的同時,還必須儲存非零元素所在的行號 列號,才能迅速確定乙個非零元素是矩陣中的哪乙個元素。稀疏矩陣的壓縮儲存會失去隨機訪問功能。其中每乙個非零元素所在的行號 列號和值組成乙個三元組 i,...
稀疏矩陣的加法(c語言)
用二維陣列發現一直段錯誤,查閱資料發現是棧中一次存不了太多二維陣列 最後還是轉回到結構體來寫,我感覺陣列更簡單的 include include includeint main int nu scanf d d row,col scanf d n1 for i 0 i0.1 printf d cou...
稀疏矩陣加法 資料結構實驗題(稀疏矩陣加法)
題目描述 思路 先使用乙個結構體對稀疏矩陣進行壓縮儲存 typedef struct array 之後用歸併的思想,將a矩陣與b矩陣相加的結果存放在c矩陣中if a i row 若a行號小於b行號,則將a放入c else if a i row b j row 若a行號大於b行號,則存b else 若...