//三元组数值有一个特点:那就是在不同位置上的行值相同的元素
//一定是按照列值升序出现的。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct TRIPLE//三元组成员
{
int row;
int col;
int value;
}TRIPLE;
typedef struct TRIPLE_HEAD//三元组头
{
int rowCount;
int colCount;
int elementCount;
TRIPLE *values;
}TRIPLE_HEAD;
TRIPLE_HEAD *initTriple();
void destoryTriple(TRIPLE_HEAD *triHd);
void showTriple(TRIPLE_HEAD triHd);
TRIPLE_HEAD *revange(TRIPLE_HEAD trip);
TRIPLE_HEAD *revange(TRIPLE_HEAD trip)
{
TRIPLE_HEAD *ntrip = NULL; //new
int t; //temp
int *ass; //辅助数组
int i;
int index;
ass = (int *)malloc(sizeof(int)* (trip.colCount + 1));
memset(ass, 0, sizeof(int) * (trip.colCount + 1));//数组清零
for (i = 0; i < trip.elementCount; i++)
{
//统计列下标+1 的成员 的个数
ass[trip.values[i].col + 1]++;
}
printf("数组ass元素值如下:(列 个数)\n");
for (i = 0; i < trip.colCount + 1; i++)
printf("%d, %d\n", i, ass[i]);
for (i = 1; i < trip.colCount; i++)
ass[i] += ass[i - 1];
ntrip = (TRIPLE_HEAD *)malloc(sizeof(TRIPLE_HEAD));
*ntrip = trip;
//交换行列
t = ntrip->rowCount;
ntrip->rowCount = ntrip->colCount;
ntrip->colCount = t;
ntrip->values = (TRIPLE *)malloc(sizeof(TRIPLE)* ntrip->elementCount);
for (i = 0; i < trip.elementCount; i++)
{
index = ass[trip.values[i].col]++;
ntrip->values[index] = trip.values[i];
t = ntrip->values[index].col;
ntrip->values[index].col = ntrip->values[index].row;
ntrip->values[index].row = t;
}
free(ass);
return ntrip;
}
void showTriple(TRIPLE_HEAD triHd)
{
int i, j, t = 0;
printf("\n");
for (i = 0; i < triHd.rowCount; i++)
{
for (j = 0; j < triHd.colCount; j++)
{
if (t < triHd.elementCount && i == triHd.values[t].row && j == triHd.values[t].col){
printf("%d ", triHd.values[t++].value);
}
else{
printf("0 ");
}
}
printf("\n");
}
}
void destoryTriple(TRIPLE_HEAD *triHd)
{
free(triHd->values);
free(triHd);
}
TRIPLE_HEAD *initTriple()
{
TRIPLE_HEAD *th;
int row;
int col;
int value;
int i;
th = (TRIPLE_HEAD *)malloc(sizeof(TRIPLE_HEAD));
printf("请输入矩阵的阶数(行 列):");
scanf("%d%d", &th->rowCount, &th->colCount);
printf("请输入有效元素的个数:\n");
scanf("%d", &th->elementCount);
th->values = (TRIPLE *)malloc(sizeof(TRIPLE)* th->elementCount);
for (i = 0; i < th->elementCount; i++)
{
printf("请输入第%d个元素(行 列 值)(共%d个):", i+1, th->elementCount);
scanf("%d%d%d", &row, &col, &value);
th->values[i].row = row;
th->values[i].col = col;
th->values[i].value = value;
}
return th;
}
void main(void)
{
TRIPLE_HEAD *trip, *revTrip;
trip = initTriple();
showTriple(*trip);
revTrip = revange(*trip);
showTriple(*revTrip);//转置之后的稀疏矩阵
destoryTriple(trip);
destoryTriple(revTrip);
system("pause");
}