數據結構與演算法(C)—矩陣

2020-08-11 23:29:48

本文變數命名字首:

  1. 全域性變數:g_
  2. 陣列:a
  3. 指針:p
  4. 結構體:st
  5. unsigned int:ui

本文程式碼可以到Github下載:https://github.com/liyuewu-github/DataStructure

一、列印矩陣

/* 列印矩陣 */
void MatrixPrint(int * apMatrix [ ], int m, int n)
{
	int iR,iC;

	for (iR = 0; iR < m; ++iR)
	{
		for (iC = 0; iC < n; ++iC)
		{
			printf("%d ",apMatrix[iR][iC]);
		}
		printf("\n ");
	}
}

二、轉圈列印矩陣

/* 矩陣轉圈列印 */
/* 輸入:
   1  2  3  4  
   5  6   7  8
   9  10  11  12
  13  14  15  16
輸出:  1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10*/
void Matrix_CirclePrint(int* apMatrix[], int iR, int iC)
{
	int iTopR, iTopC;   /*左上角座標*/
	int iBotR, iBotC;   /*右下角座標*/
	int i,j,m,n;
	
	iTopR = iTopC = 0;
	iBotR = iR -1;
	iBotC = iC - 1;
	
	while ((iTopR<=iBotR) && (iTopC<=iBotC))
	{
		/* 規律:列印一行則遍歷列,列印一列則遍歷行 */
		if (iTopR == iBotR)  /* 一行 */
		{
			for (i = iTopC; i <= iBotC; i++)
			{
				printf("%d ",apMatrix[iTopR][i]);
			}
		}
		else if (iTopC == iBotC)   /* 一列 */
		{
			for (i = iTopR; i <= iBotR; i++)
			{
				printf("%d ",apMatrix[i][iTopC]);
			}
		}
		else /* 多行多列 */
		{
			for (i = iTopC; i < iBotC; i++) /* 正向列印行,留最後一個元素,作爲下列起始 */
			{
				printf("%d ",apMatrix[iTopR][i]);
			}
			for (j = iTopR; j < iBotR; j++) /* 正向列印列,留最後一個元素,作爲下行起始 */
			{
				printf("%d ",apMatrix[j][iBotC]);
			}
			for (m = i; m > iTopC; m--) /* 逆向列印行,留最後一個元素,作爲下列起始 */
			{
				printf("%d ",apMatrix[iBotR][m]);
			}
			for (n = j; n > iTopR; n--) /* 逆向列印列,一圈結束 */
			{
				printf("%d ",apMatrix[n][iTopC]);
			}
		}
		
		/* 下一圈 */
		iTopR++;
		iTopC++;
		iBotR--;
		iBotC--;		
	}
	printf("\n ");

}

三、方陣順時針旋轉90度

/* 正方形矩陣順時針旋轉90度 */
/* 
輸入:
   1  2  3  4  
   5  6   7  8
   9  10  11  12
  13  14  15  16
輸出:
   13  9   5  1
   14  10  6  2
   15  11  7  3
   16  12  8  4*/
 /* 由外到內依次旋轉,一輪替換1->4;4->16;16->13;13->1; 輪數爲行或列元素個數 */
int ** Matrix_Rorate(int * apMatrix [ ], int iR, int iC)
{
	int iTopR, iTopC;   /*左上角座標*/
	int iBotR, iBotC;   /*右下角座標*/
	int iTime;   /*旋轉次數*/
	int iTmp;
	int **ppM;
	int i;
	ppM = malloc(iR * sizeof(int));
	for (i = 0; i < iR; ++i)
	{
		ppM[i] = apMatrix[i];
	}

	iTopR = iTopC = 0;
	iBotR = iR -1;
	iBotC = iC - 1;

	while (iTopR<iBotR)
	{
		iTime = iBotR - iTopR; /* 旋轉次數即行或列的元素個數 */
		for (i = 0; i < iTime; ++i)
		{
			iTmp = apMatrix[iTopR][iTopC+i];
			apMatrix[iTopR][iTopC+i] = apMatrix[iBotR-i][iTopC]; /*13->1*/
			apMatrix[iBotR-i][iTopC] = apMatrix[iBotR][iBotC-i]; /*16->13*/
			apMatrix[iBotR][iBotC-i] = apMatrix[iTopR+i][iBotC]; /*4->16*/
			apMatrix[iTopR+i][iBotC] = iTmp; /*1->4*/
		}

		/* 下一圈 */
		iTopR++;
		iTopC++;
		iBotR--;
		iBotC--;		
	}

	return ppM;
}

四、「之」字形列印矩陣

/* 「之」字形列印矩陣 */
/* 
輸入:
   1  2  3  4  
   5  6   7  8
   9  10  11  12
  13  14  15  16
輸出:1 2 5 9 6 3 4 7 10 13 14 11 8 12 15 16*/
void Matrix_SnakePrint(int* apMatrix[], int iR, int iC)
{
	int iTopR, iTopC;   /*左上角座標*/
	int iBotR, iBotC;   /*右下角座標*/
	int iRev;    /*摺疊列印*/
	int i,j;

	iTopR = iTopC = 0;
	iBotR = iBotC = 0;
	iRev = 0;

	/* 規律:
	1、行列沒到底,斜線首座標(iTopR, iTopC++),尾座標(iBotR++, iBotC)
	2、行到底,斜線尾座標(iBotR, iBotC++)
	3、列到底,斜線首座標(iTopR++, iTopC)*/
	while (iTopR <= iR)
	{
		if (iRev) /* 向下列印,行++,列-- */
		{
			for (i = iTopR,j=iTopC; i < iBotR+1; i++,j--)
			{
				printf("%d ",apMatrix[i][j]);
			}
		}
		else /* 向上列印,行--,列++ */
		{
			for (i = iBotR,j=iBotC; j < iTopC+1; i--,j++)
			{
				printf("%d ",apMatrix[i][j]);
			}
		}

		if (iTopC == iC-1) /* 列印到了最後一列,行號下移 */
		{
			iTopR++;
		}
		else /* 不到了最後一列,列號下移 */
		{
			iTopC++;
		}

		if (iBotR==iR-1) /* 列印到了最後一行,列號下移 */
		{
			iBotC++;
		}
		else /* 不到了最後一行,行號下移 */
		{
			iBotR++;
		}
		
		iRev = !iRev;
	}
	printf("\n ");
	return;
}

五、測試程式

int main()
{
	int aM[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
	int *pM[4] = {aM[0],aM[1],aM[2],aM[3]};
	int **ppM;

	printf("--Circle Print--\n");
	Matrix_CirclePrint(pM, 4, 4);

	printf("--Snake Print--\n");
	Matrix_SnakePrint(pM, 4, 4);

	printf("--Rorate Print--\n");
	printf("input:\n ");
	MatrixPrint(pM, 4, 4);

	ppM = Matrix_Rorate(pM, 4, 4);

	printf("output:\n ");
	MatrixPrint(pM, 4, 4);



	return 0;
}

在这里插入图片描述