数据结构——数组和广义表(三元顺序表之一般转置和快速转置)

辛辛苦苦写的代码,点个赞再走呗

里面还有注释呢

#include"iostream"
#include"algorithm"
using namespace std;
#define MAXSIZE 10
typedef struct Triple{
	int i;
	int j;
	int Element;
	Triple(int d=0,int e = 0,int f = 0){
		i = d;
		j = e;
		Element = f;
	}

}Triple;
typedef struct{
	Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用
	int mu,nu,tu;
}TSMatrix;
void TransposeMatrix(TSMatrix M,TSMatrix &T){
	T.mu = M.nu;T.nu = M.mu;T.tu = M.tu;
	if(T.mu){
		int p = 1;
		for(int col = 1;col<=M.mu;col++){
			for(int	q = 1;q<=M.tu;q++)
				if(M.data[q].j == col)
				{
					T.data[p].Element = M.data[q].Element;
					T.data[p].j = M.data[q].i;
					T.data[p].i = M.data[q].j;
					p++;

				}
		}
	}

}
void Output(TSMatrix &tsmatrix){

	for(int i = 1;i<=tsmatrix.tu;i++){
		cout<<"第"<<tsmatrix.data[i].i<<"行"<<"第"<<tsmatrix.data[i].j<<"列"<<"的元素是:"<<tsmatrix.data[i].Element<<endl;
	}
}
void FastTransposeSMatrix(TSMatrix M,TSMatrix &T){
	T.mu = M.nu;T.nu = M.mu;T.tu = M.tu;
	int* num = new int[M.nu+1];//M.nu = 10
	int* cpot = new int[M.nu+1];
	if(T.tu){
		//赋初值,不然的话是一个乱数
		for(int col= 1;col<= M.nu;col++){
			num[col] = 0;
			cpot[col] = 0;
		}

		for(int col = 1;col<=M.tu;col++ ) ++num[M.data[col].j];
		cout<<"............统计列频:既每一列有几个数据........."<<endl;
		for(int col=1;col<=M.nu;col++){
			cout<<col<<"列"<<num[col]<<endl;
		}
		cpot[1] = 1;
		for(int col= 2;col<= M.nu;col++){
			cpot[col] =cpot[col-1] + num[col-1];
		}
		cout<<"............统计每一列中第一个元素所在T中的位置........."<<endl;
		for(int col=1;col<=M.nu;col++){
			cout<<col<<"列"<<cpot[col]<<endl;
		}
		//实现说明M.列就是T.行.
		//cpot 中的值表示M中每一列第一位元素在T中位置[1.....tu],
		//num[i]表示M中第i列共有几个元素,然后cpot[i]就占用几个坑位
		//每占用了一个位置之后,就得使该位置的值+1;等待T中相同行的数据进入
		//可以保证的是一次循环就把所有的坑位填满了
			
		for(int p =1;p<=M.tu;p++){
			//把M表中的数据和cpot的那个表链接起来
			int col = M.data[p].j;
			int q = cpot[col];
			T.data[q].Element = M.data[p].Element;T.data[q].i = M.data[p].j;T.data[q].j = M.data[p].i;
			//
			++cpot[col];
		}
	}
}
int main(){
	TSMatrix tsmatrix;
	tsmatrix.mu = 6;
	tsmatrix.nu = 7;
	tsmatrix.tu = 7;

	//Triple* ptr = tsmatrix.data;
	//ptr++;

	tsmatrix.data[1].i = 1;tsmatrix.data[1].j = 2;tsmatrix.data[1].Element =33;
	tsmatrix.data[2].i = 1;tsmatrix.data[2].j = 3;tsmatrix.data[2].Element =9;
	tsmatrix.data[3].i = 3;tsmatrix.data[3].j = 1;tsmatrix.data[3].Element =10;
	tsmatrix.data[4].i = 3;tsmatrix.data[4].j = 6;tsmatrix.data[4].Element =36;
	tsmatrix.data[5].i = 4;tsmatrix.data[5].j = 3;tsmatrix.data[5].Element =16;
	tsmatrix.data[6].i = 5;tsmatrix.data[6].j = 2;tsmatrix.data[6].Element =28;
	tsmatrix.data[7].i = 6;tsmatrix.data[7].j = 4;tsmatrix.data[7].Element =37;

	TSMatrix T;
	//一般转置
	//TransposeMatrix(tsmatrix,T);
	//快速转置
	FastTransposeSMatrix(tsmatrix,T);

	Output(tsmatrix);
	cout<<"....................."<<endl;
	Output(T);

	system("pause");
	return 0;

}
发布了114 篇原创文章 · 获赞 28 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/ChaoFeiLi/article/details/103172676