1、随机产生一个以三元组顺序表存储的稀疏矩阵,并对其进行转置。具体要求如下: ①矩阵的行数不低于8,列数不低于12。 ②非零元的个数、每个非零元的位置及值均随机产生。 ③打印转置前后的矩阵以验证正确性。C语言
时间: 2023-06-17 15:05:42 浏览: 179
以下是一个示例代码,生成稀疏矩阵并进行转置:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 8
#define COL 12
#define MAX 10 // 非零元最大值
typedef struct {
int row, col;
int value;
} Triple;
void printMatrix(int matrix[ROW][COL]) {
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
printf("%d\t", matrix[i][j]);
}
printf("\n");
}
}
void printTriple(Triple triple[], int len) {
for (int i = 0; i < len; i++) {
printf("%d\t%d\t%d\n", triple[i].row, triple[i].col, triple[i].value);
}
}
void transpose(Triple triple[], int len) {
// 计算每行非零元个数
int rowCounts[ROW] = { 0 };
for (int i = 0; i < len; i++) {
rowCounts[triple[i].row]++;
}
// 计算每行非零元在转置后的位置
int rowStarts[ROW] = { 0 };
for (int i = 1; i < ROW; i++) {
rowStarts[i] = rowStarts[i-1] + rowCounts[i-1];
}
// 转置
Triple newTriple[len];
for (int i = 0; i < len; i++) {
int j = rowStarts[triple[i].row]++;
newTriple[j].row = triple[i].col;
newTriple[j].col = triple[i].row;
newTriple[j].value = triple[i].value;
}
// 输出转置后的矩阵
int matrixT[COL][ROW] = { 0 };
for (int i = 0; i < len; i++) {
matrixT[newTriple[i].row][newTriple[i].col] = newTriple[i].value;
}
printf("转置后的矩阵:\n");
printMatrix(matrixT);
}
int main() {
srand(time(NULL));
// 生成稀疏矩阵
int matrix[ROW][COL] = { 0 };
int count = 0;
Triple triple[ROW*COL];
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
int value = rand() % MAX;
if (value != 0) {
triple[count].row = i;
triple[count].col = j;
triple[count].value = value;
matrix[i][j] = value;
count++;
}
}
}
// 输出原始矩阵及稀疏矩阵
printf("原始矩阵:\n");
printMatrix(matrix);
printf("稀疏矩阵:\n");
printTriple(triple, count);
// 转置稀疏矩阵
transpose(triple, count);
return 0;
}
```
其中,`Triple` 结构体表示三元组,即稀疏矩阵中的一个非零元。`printMatrix` 函数用于打印正常矩阵,`printTriple` 函数用于打印稀疏矩阵的三元组表示。`transpose` 函数用于转置稀疏矩阵,并打印转置后的矩阵。
代码中使用了随机数生成非零元。你可以根据需要修改生成方法。
阅读全文