C語言演算法實驗 稀疏矩陣

2021-08-20 07:09:32 字數 4239 閱讀 5054

實驗內容與要求

內容:

問題描述:從鍵盤輸入乙個稀疏矩陣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 若...