稀疏矩陣A、B均採用三元組順序表表示,驗證實現矩陣A快速轉置算法,並設計、驗證矩陣A、B相加得到矩陣C的算法。
- 從鍵盤輸入矩陣的行數和列數,隨機生成稀疏矩陣。
- 設計算法將隨機生成的稀疏矩陣轉換成三元組順序表形式存儲。
- 設計算法將快速裝置得到的與相加得到的三元組順序表分別轉換成矩陣形式。
- 輸出隨機生成的稀疏矩陣A、B及其三元組順序表表示、快速轉置得到的與相加得到的三元組順序表及其矩陣形式。
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define maxsize 12500
typedef struct{
int i;//元素的行下標
int j;//元素的列下標
int v;//元素的值
}Triple;
//定義三元組
typedef struct{
Triple data[maxsize+1]; // data[0]未用
int mu,nu,tu;//元素的總行數,總列數,不爲0元素個數
}TSMatrix;
//動態二維數組生成隨機矩陣
int **RandomMatrix(int M,int N){
int **a;
int i, j;
a=(int **)malloc(M*sizeof(int*));
for(i=0;i<M;i++)
a[i]=(int *)malloc(N*sizeof(int));
srand((unsigned)time(0));
for (i = 0; i < M; ++i)
{
for (j = 0; j <= N; ++j)
{
a[i][j] = rand() % 10;
}
}
return a;
}
//打印矩陣
void printMatrix(int **a,int M,int N){
int i,j;
for (i = 0; i <M; ++i)
{
for (j = 0; j <N; ++j)
{
printf("%d\t", a[i][j]);
}
printf("\n");
}
}
//打印三元組
void printTSMatrix(TSMatrix M){
int t;
for(t=1;t<=M.tu;t++){
printf("%d %d %d \n",M.data[t].i,M.data[t].j,M.data[t].v);
}
}
//把矩陣轉化成三元組形式
TSMatrix changeToTSMatrix(int **a,int MA,int NA){
TSMatrix M;
int H,L;
int i,j,t;
t=1;//三元組的位置
M.tu=0;
M.mu=MA;
M.nu=NA;
for(i=0;i<M.mu;i++){
for(j=0;j<M.nu;j++){
if(a[i][j]!=0){
M.data[t].i=(i+1);
M.data[t].j=(j+1);
M.data[t].v=a[i][j];
t++;
M.tu++;
}
}
}
printTSMatrix(M);
return M;
}
//快速轉置
void kszzTSMatrix(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]++;//把當前一列元素的位置後移一個單位
}
printf("");
}
}
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;
}
else{
return 1;
}
}
else if(c1.i<c2.i){
return -1;
}
else{
return 1;
}
}
//三元組相加
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){
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){
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){
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--;
printf("hhhhhh%d",C->tu);
return 0;
}
//把三元組轉換成矩陣形式輸出
void changetoMartix(TSMatrix A){
int p=1,row,col;
int d;
for(row=1;row<=A.mu;row++){
printf("\n");
for(col=1;col<=A.nu;col++){
if((A.data[p].i=row)&&(A.data[p].j==col)){
d=A.data[p].v;
p++;
}
else{
d=0;
}
printf(" %d ",d);
}
}
printf("\n");
}
int main(){
int **A,**B;
TSMatrix TA,TB,TC;
TSMatrix TTA;//保存轉置了的三元組
int t;
int MA=0,NA=0,MB=0,NB=0;
printf("請輸入A矩陣的行數,列數:\n");
scanf("%d %d",&MA,&NA);
A=RandomMatrix(MA,NA);
printf("A矩陣爲:\n");
printMatrix(A,MA,NA);
printf("請輸入B矩陣的行數,列數:\n");
scanf("%d %d",&MB,&NB);
B=RandomMatrix(MB,NB);
printf("B矩陣爲:\n");
printMatrix(B,MB,NB);
printf("三元組順序表形式A爲:\n");
TA=changeToTSMatrix(A,MA,NA);
printf("三元組順序表形式B爲:\n");
TB=changeToTSMatrix(B,MB,NB);
kszzTSMatrix(TA,&TTA);
printf("轉置後的TA:\n");
printTSMatrix(TTA);
addTSMatrix(TA,TB,&TC);
printf("A+B相加得到的三元組C:\n");
printTSMatrix(TC);
printf("TA的轉置矩陣形式:\n");
changetoMartix(TTA);
printf("TC的矩陣形式:\n");
changetoMartix(TC);
return 0;
}