對稀疏矩陣壓縮後轉置

#include<stdio.h>
#include<stdlib.h>

//define 
struct Arr
{
	int i,j;
	int data;
};
struct ST
{
	Arr* data;
	int i,j,num;
};

//矩陣壓縮 
ST* change(int arr[][3],int x,int y)
{
	ST *M;
	int i,j;
	int count=0;
	M=(ST*)malloc(sizeof(ST));
	M->i=x;
	M->j=y;
	//遍歷矩陣 記錄矩陣元素個數 
	for(i=0;i<x;i++)
	{
		for(j=0;j<y;j++)
		{
			if(arr[i][j]!=0)
			{
				count++;
			}//Of if
		}//Of for j
	}//Of for i
	M->num=count;
	M->data=(Arr*)malloc(sizeof(Arr)*count);
	count=0;
	//遍歷矩陣  找到元素在矩陣中的座標 
	for(i=0;i<x;i++)
	{
		for(j=0;j<y;j++)
		{
			if(arr[i][j]!=0)
			{
				M->data[count].i=i+1;
				M->data[count].j=j+1;
				M->data[count].data=arr[i][j];
				count++;
			}//Of if
		}//of for j
	}//Of for i
	return M;
}//Of change

//打印矩陣 
void print(ST* m)
{
	int i;
	for(i=0;i<m->num;i++)
	{
		printf("%d\t%d\t%d\n",m->data[i].i,m->data[i].j,m->data[i].data);
	}//Of for i
}//Of print

//轉置矩陣 算法1 
ST* transpose(ST* M)
{
	ST* T;
	int iI,jJ;
	int count=0;
	T=(ST*)malloc(sizeof(ST));
	T->data=(Arr*)malloc(sizeof(Arr)*M->num);
	T->i=M->j;
	T->j=M->i;
	T->num=M->num;
	for(iI=0;iI<M->j;iI++)
	{
		for(jJ=0;jJ<M->num;jJ++)
		{
			if(M->data[jJ].j==iI+1)
			{
				T->data[count].i=M->data[jJ].j;
				T->data[count].j=M->data[jJ].i;
				T->data[count].data=M->data[jJ].data;
				count++;
			}//Of if
		}//Of for j
	}//Of for i
	return T;
}//Of trnaspose


//轉置矩陣 算法2 
ST* quickTranspose(ST* M)
{
	ST *T;
	int count[3]={0};//記錄對應行列的個數 
	int position[3]={0};//記錄對應元素應該插入的位置 
	int i,num=0;
	T=(ST*)malloc(sizeof(ST));
	T->data=(Arr*)malloc(sizeof(Arr)*M->num);
	T->i=M->j;
	T->j=M->i;
	T->num=M->num;
	for(i=0;i<M->num;i++)
	{
		count[M->data[i].j-1]++;
	}//Of for i
	for(i=1;i<3;i++)
	{
		position[i]=count[i-1]+position[i-1];
	}//Of for i
	for(i=0;i<M->num;i++)
	{
		
		T->data[position[M->data[i].j-1]].i=M->data[i].j;
		T->data[position[M->data[i].j-1]].j=M->data[i].i;
		T->data[position[M->data[i].j-1]].data=M->data[i].data;
		position[M->data[i].j-1]++;
	}//Of for i
	return T;
}

//main 
int main()
{
	ST *M,*T;
	int array[4][3]={{0,12,9},{0,0,0},{-3,0,0},{5,0,0}};
	printf("壓縮後矩陣爲:\n");
	M=change(array,4,3);
	print(M);
	printf("轉置後矩陣爲:\n");
	T=transpose(M);
	print(T);
	printf("快速算法轉置後矩陣爲:\n");
	T=quickTranspose(M);
	print(T);
	
	return 0;
}//Of main

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