稀疏矩陣A、B均採用三元組順序表表示,驗證實現矩陣A快速轉置算法,並設計、驗證矩陣A、B相加得到矩陣C的算法。

數據結構實驗題目:

稀疏矩陣A、B均採用三元組順序表表示,驗證實現矩陣A快速轉置算法,並設計、驗證矩陣A、B相加得到矩陣C的算法。

(1)從鍵盤輸入矩陣的行數和列數,隨機生成稀疏矩陣。
(2) 設計算法將隨機生成的稀疏矩陣轉換成三元組順序表形式存儲。
(3) 設計算法將快速轉置得到的與相加得到的三元組順序表分別轉換成矩陣形式。
(4) 輸出隨機生成的稀疏矩陣A、B及其三元組順序表、快速轉置得到的與相加得到的三元組順序表及其矩陣形式。

  1. 從鍵盤輸入矩陣的行數和列數,隨機生成稀疏矩陣。(老師要求不能用二維數組去貯存矩陣)
    也就是說直接生成三元組
//動態隨機生成三元組
TSMatrix Romand(int m,int n){
	TSMatrix M;
	int t=1;
	int num[100]={0};//記錄數組位置是否是非0元
	M.mu=m;
    M.nu=n;
    M.tu=(int)(m*n*factor)+1;//factor爲稀疏因子
	srand((unsigned)time(0));
	while(t!=M.tu+1){
		M.data[t].i = rand() % m+1;
		M.data[t].j = rand() % n+1;
		if(num[(M.data[t].i-1)*n+M.data[t].j] == 0){//如果該位置沒有數據,屬於0元
			M.data[t].v = rand() % 10+1;
			t++;
			num[(M.data[t].i-1)*n+M.data[t].j] = 1;
		}  
	}
	//對三元組排序
	for(int i=1;i<=M.tu;i++){
		for(int j = i+1;j<=M.tu;j++){
			if((M.data[i].i > M.data[j].i)||(M.data[i].i == M.data[j].i&&M.data[i].j > M.data[j].j)){
				Triple a;
				a = M.data[i];
				M.data[i] = M.data[j] ;
				M.data[j] = a;
			}
		}
	} 
	return M;
} 
  1. 算法將快速轉置得到的與相加得到的三元組順序表分別轉換成矩陣形式。
    這一步呢我們就按照矩陣形式輸出就行了,不用實際轉。
//打印矩陣 
void printMatrix(TSMatrix M,int m,int n){
	int t=1,k=0;
	for(int i= 1; i<=m;i++){
		for(int j=1; j<=n;j++){
			if(M.data[t].i == i&&M.data[t].j == j){
				printf("%d\t", M.data[t].v );
				t++;
			}else{
				printf("0\t"); 
			}
		}
		printf("\n"); 
	}
}

3.快速轉置算法

/快速轉置
void fastTSMatrix(TSMatrix M,TSMatrix *T){
	//初始化T(行數、列數、元素個數)
	int q,p,col;
	int num[100];
	int cpot[100];
	T->mu=M.nu;
	T->nu=M.mu;
	T->tu=M.tu; 
	if(T->tu>0){
		for(col=1;col<=M.nu;col++) num[col]=0;//初始化求num[] 爲0 
			for(p=1;p<=M.tu;p++)	num[M.data[p].j]++;//求每一列的num[],即求出每一列的有值元素的個數 
		//求cpot[]
		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].v=M.data[p].v;
			cpot[col]++;//把當前一列元素的位置後移一個單位 
		}
	}
}

4.三元組相加
三元組相加是行與列相同既相加,不同則就不用相加,自己把其賦值給新數組。

int cmp(Triple c1,Triple c2){
	if(c1.i==c2.i){
		if(c1.j==c2.j){//位置相同 
			return 0;
		} 
		else if(c1.j<c2.j){
				return -1;//A在B的前 
			}	
			 else{
			 	return 1;//B在A的前
			 }
	}
	else if(c1.i<c2.i){
			return -1;//A在B的前 
		} 
		else{
			return 1;//B在A的前
		} 		
}
//三元組相加 
int addTSMatrix(TSMatrix A,TSMatrix B,TSMatrix *C){
	int i,j;
	int p=1,q=1;
	C->tu=1;
	while((p<=A.tu)&&(q<=B.tu)){
		if(cmp(A.data[p],B.data[q])==-1){//A在B的前 
			C->data[C->tu].i=A.data[p].i;
			C->data[C->tu].j=A.data[p].j;
			C->data[C->tu++].v=A.data[p].v;
			p++;
		}
		if(cmp(A.data[p],B.data[q])==1){//B在A的前 
				C->data[C->tu].i=B.data[q].i;//
				C->data[C->tu].j=B.data[q].j;//
				C->data[C->tu++].v=B.data[q].v;
				q++;
		}
		if(cmp(A.data[p],B.data[q])==0){//i,j 相同 
			if(A.data[p].v+B.data[q].v != 0){
				C->data[C->tu].i=A.data[p].i;
				C->data[C->tu].j=A.data[p].j;
				C->data[C->tu++].v=A.data[p].v+B.data[q].v;
			}
			p++;
			q++;
		} 
	}
	//將剩下的三元組的合併 
	C->mu=A.mu;
	C->nu=A.nu;
	while((p<=A.tu)){
		C->data[C->tu].i=A.data[p].i;
		C->data[C->tu].j=A.data[p].j;
		C->data[C->tu++].v=A.data[p].v;
		p++;
		C->mu=A.mu;
		C->nu=A.nu;
	} 
	while((q<=B.tu)){
		C->data[C->tu].i=B.data[q].i;
		C->data[C->tu].j=B.data[q].j;
		C->data[C->tu++].v=B.data[q].v;
		q++;
		C->mu=B.mu;
		C->nu=B.nu;
	}
	C->tu--;
	return 0;
}

5.三元組的數據結構:

#define maxsize 1250
typedef struct{
    int i;//元素的行下標 
    int j;//元素的列下標 
    int v;//元素的值 
}Triple;
//定義三元組
typedef struct{
    Triple  data[maxsize+1];  // data[0]未用
    int  mu,nu,tu;//元素的總行數,總列數,不爲0元素個數 
}TSMatrix;

6.測試結果:
請輸入A矩陣的行數,列數
2
2
A矩陣爲:
0 5
0 0
三元組順序表形式A爲:
1 2 5
請輸入B矩陣的行數,列數
2
2
B矩陣爲:
0 0
0 5
三元組順序表形式B爲:
2 2 5
轉置後的TA:
2 1 5
轉置後的TA的矩陣形式:
0 0
5 0
A+B矩陣三元組表示:
1 2 5
2 1 5
TC的矩陣形式:
0 5
5 0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章