1. 程式人生 > >學習筆記------資料結構(C語言版)陣列之三元組順序表

學習筆記------資料結構(C語言版)陣列之三元組順序表

//TSMatrix.cpp

#include"predefined.h"
#include"TSMatrix.h"

Status TransposeSMatrix(TSMatrix M,TSMatrix *T)
//演算法5.1:採用三元組表儲存表示,求稀疏矩陣M的轉置矩陣T
{
	int q,p,col;
	(*T).mu=M.mu;
	(*T).nu=M.nu;
	(*T).tu=M.tu;
	if(M.tu)
	{
		q=1;
		for(col=1;col<=M.nu;col++)
			for(p=1;p<=M.tu;p++)
				if(M.data[p].j==col)
				{
					(*T).data[q].i=M.data[p].j;
					(*T).data[q].j=M.data[p].i;
					(*T).data[q].e=M.data[p].e;
					q++;
				}
	}
	return OK;
}

Status FastTransposeSMatrix(TSMatrix M,TSMatrix *T)
//演算法5.2:採用三元順序表儲存表示,求稀疏矩陣M的轉置矩陣T
{
	int num[10],cpot[10],t,p,col,q;
	(*T).mu=M.mu;
	(*T).nu=M.nu;
	(*T).tu=M.tu;
	if(M.tu)
	{
		for(col=1;col<=M.nu;col++)
			num[col]=0;
		for(t=1;t<=M.tu;t++)
			++num[M.data[t].j];
		cpot[1]=1;
		for(col=2;col<=M.nu;col++)
			cpot[col]=num[col-1]+cpot[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].e=M.data[p].e;
			cpot[col]++;
		}
	}
	return OK;
}

Status CreateSMatrix(TSMatrix *M)
//建立稀疏矩陣
{
	int i,m,n;
	ElemType e;
	printf("請輸入矩陣的行、列、非零元個數:");
	scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu);
	for(i=1;i<=(*M).tu;i++)
	{
		printf("請按行序順序輸入第%d個非零元素所在的行(1~%d),列(1~%d),元素值:",i,(*M).mu,(*M).nu);
		scanf("%d,%d,%d",&m,&n,&e);
		(*M).data[i].i=m;
		(*M).data[i].j=n;
		(*M).data[i].e=e;
	}
	return OK;
}

void PrintSMatrix(TSMatrix M)
//列印稀疏矩陣
{
	int i;
	printf("%d行%d列%d個非零元素。\n",M.mu,M.nu,M.tu);
	printf("行  列  元素值\n");
	for(i=1;i<=M.tu;i++)
		printf("%2d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e);
 }

//TSMatrix.h
#define MAXSIZE 12500
typedef int ElemType;
typedef struct
{
	int i,j;
	ElemType e;
}Triple;
typedef struct
{
	Triple data[MAXSIZE+1];//date[0]未用
	int mu,nu,tu;
}TSMatrix;

Status TransposeSMatrix(TSMatrix M,TSMatrix *T);
Status CreateSMatrix(TSMatrix *M);
void PrintSMatrix(TSMatrix M);
Status FastTransposeSMatrix(TSMatrix M,TSMatrix *T);