二维矩阵转三元组(稀疏矩阵)

很早以前写的程序了,今天上传一例,待整理成面向对象的封装结构,呵呵

将二维数组用三元组保存,然后调用三元组的转置方法,最后输出对应的二维数组

执行结果:

二维矩阵转三元组(稀疏矩阵)_第1张图片

// 稀疏矩阵.cpp : Defines the entry point for the console application. @sonikk 2010-7-6
//
#include "stdafx.h"
#include <stdio.h>
#include <malloc.h>
//定义三元组顺序表
#define MAXSIZE 100 //非零元素最大值为100
#define MU 5 //行数
#define NU 5 //列数
#define NULL 0

struct Triple //---------------------------定义三元组结构体----------------------------
{
	int i,j;
	int e;
};

struct TSMatrix
{
	Triple data[MAXSIZE-1]; //非零元三元组表,data[0]未用
	int mu; //行数
	int nu; //列数
	int tu; //非零元个数
};	//-----------------------------------------------------------------------

int getMu()  //得到数组行数
{
	return MU;
}

int getNu() //得到数组列数
{
	return NU;
}

int getTu(int a[][NU])  //得到数组非零元个数
{
	int i,j,count=0;
	for(i=0;i<MU;i++) for(j=0;j<NU;j++) if(a[i][j]!=0) count++;

	return count;
}

void changeTo3YZ(struct TSMatrix &m,int a[][NU]) //将二维数组转换成三元组 三元组的初始化
{
	int i,j,t=1;

	m.mu=getMu();
	m.nu=getNu();
	m.tu=getTu(a);

	for(i=0;i<MU;i++)

		for(j=0;j<NU;j++)
		{
			if(a[i][j]!=0)
			{
				m.data[t].i=i;
				m.data[t].j=j;
				m.data[t].e=a[i][j];
				t++;
			}
		}
}

void outputArr(int a[][NU]) //输出二维数组
{
	int i,j;

	for(i=0;i<MU;i++,printf("\n"))

		for(j=0;j<NU;j++)
		{
			printf("%d ",a[i][j]);
		}
}

void output3YZ(TSMatrix &m)  //输出三元组表
{
	int i;
	printf("\n三元组表为:\n");

	for(i=1;i<=m.tu;i++)
	{
		printf("%d: %d %d %d\n",i,m.data[i].i,m.data[i].j,m.data[i].e);
	}

	printf("\n");

}

void output2W(TSMatrix m) //将三元组输出成二维数组
{

	int i,j,k,putZero=1;

	printf("\n");
	for(i=0;i<m.mu;i++)
	{

		for(j=0;j<m.nu;j++)
		{
			for(k=1;k<=m.tu;k++)
			{
				if(i==m.data[k].i && j==m.data[k].j) 
				{	 
					printf("%d ",m.data[k].e);
					putZero=0;
				}
			}

			if(putZero) printf("0 ");
			putZero=1;
		}

		printf("\n");
	}

}

void fastTransposeSMatrix(TSMatrix &t,TSMatrix m) //求三元组矩阵m的转置矩阵t
{

	int *num,*cpot;
	int i,col,q; //col表示列

	t.mu=m.mu;
	t.nu=m.nu;
	t.tu=m.tu;

	num=(int *)malloc(sizeof(int)*m.tu);  //动态创建向量数组
	cpot=(int *)malloc(sizeof(int)*m.tu);

	for(i=0;i<m.tu;i++) //全部归0
	{
		*(num+i)=0;
	}


	if(m.tu)
	{
		for(i=0;i<m.tu;i++)
		{
			*(num+m.data[i+1].j)+=1;
		}

		for(i=0;i<m.tu;i++)
		{
			if(i==0) *(cpot+i)=1;
			else *(cpot+i) = *(num+i-1)+ *(cpot+i-1);
		}


		for(i=0;i<m.tu;i++)  //递交
		{
			col=m.data[i+1].j;
			q=*(cpot+col);

			t.data[q].i= m.data[i+1].j;
			t.data[q].j= m.data[i+1].i;
			t.data[q].e= m.data[i+1].e;

			*(cpot+col)+=1;
		}

	}

	free(num);
	free(cpot);
}

//定义二维数组 MU=NU=4
int matrix[MU][NU]=
{
	{1,0,0,4},
	{3,5},
	{0,0,7,9},
	{0,2},
	{0,0,0,0,1}
};

void main(int argc, char* argv[])
{
	TSMatrix m,t; //定义两个三元组矩阵,t为转置后的
	outputArr(matrix); //输出二维数组
	printf("\n非零元个数为:%d\n",getTu(matrix)); //输出非零元个数
	changeTo3YZ(m,matrix); //将二维数组转换为三元组
	output3YZ(m); //输出该三元组表
	printf("\n调用转置方法...\n");
	fastTransposeSMatrix(t,m); //将m转置后放到t
	output3YZ(t); //输出该三元组表

	output2W(t); //输出转置后的二维数组

	getchar();
}


你可能感兴趣的:(C++,三元组)