C语言代码实现一、实验目的 掌握稀疏矩阵的存储表示和矩阵的基本运算。 二、实验内容: 1. 以带行逻辑连接信息的三元组顺序表存储稀疏矩阵 2.实现两个矩阵相加、相减、相乘、转置的运算。 3.实现界面输入稀疏矩阵的三元组表示形式,而运算结果的矩阵结果采用阵列形式在界面上显示。
时间: 2023-09-07 07:04:25 浏览: 91
### 回答1:
很好,以下是C语言代码实现稀疏矩阵存储及基本运算的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 稀疏矩阵三元组顺序表的最大长度
typedef struct {
int row; // 三元组中元素的行号
int col; // 三元组中元素的列号
int val; // 三元组中元素的值
} Triple;
typedef struct {
Triple data[MAXSIZE + 1];
int rows, cols, nums; // 稀疏矩阵的行数、列数、非零元素个数
} SparseMatrix;
// 以三元组顺序表形式输入稀疏矩阵
void InputSparseMatrix(SparseMatrix *S) {
int i;
printf("请输入稀疏矩阵的行数、列数和非零元素个数:\n");
scanf("%d%d%d", &S->rows, &S->cols, &S->nums);
printf("请输入%d个非零元素的行号、列号和值:\n", S->nums);
for (i = 1; i <= S->nums; ++i) {
scanf("%d%d%d", &S->data[i].row, &S->data[i].col, &S->data[i].val);
}
}
// 打印稀疏矩阵的三元组表
void PrintSparseMatrix(const SparseMatrix *S) {
int i;
printf("稀疏矩阵的三元组表如下:\n");
printf("(%d,%d,%d)\n", S->rows, S->cols, S->nums);
for (i = 1; i <= S->nums; ++i) {
printf("(%d,%d,%d)\n", S->data[i].row, S->data[i].col, S->data[i].val);
}
}
// 转置稀疏矩阵
void TransposeSparseMatrix(const SparseMatrix *S, SparseMatrix *T) {
int i, j, k = 1;
T->rows = S->cols;
T->cols = S->rows;
T->nums = S->nums;
for (j = 1; j <= S->cols; ++j) {
for (i = 1; i <= S->nums; ++i) {
if (S->data[i].col == j) {
T->data[k].row = S->data[i].col;
T->data[k].col = S->data[i].row;
T->data[k].val = S->data[i].val;
++k;
}
}
}
}
// 稀疏矩阵相加
void AddSparseMatrix(const SparseMatrix *A, const SparseMatrix *B, SparseMatrix *C) {
int i = 1, j = 1, k = 1;
if (A->rows != B->rows || A->cols != B->cols) {
printf("两个矩阵的行数或列数不相等,无法相加!\n");
return;
}
C->rows = A->rows;
C->cols = A->cols;
while (i <= A->nums && j <= B->nums) {
if (A->data[i].row < B->data[j].row ||
(A->data[i].row == B->data[j].row && A->data[i].col < B->data[j].col)) {
C->data[k] = A->data[i];
++i;
} else if (A->data[i].row > B->data[j].row ||
(A->data[i].row == B->data[j].row && A->data[i].col > B->data[j].col)) {
C->data[k] = B->data[j];
++j;
} else {
C->data[k].row = A->data[i].row;
C->data[k].col = A->data[i].col;
C->data[k].val = A->data[i].val + B->data[j].val;
++i;
++j;
}
++k;
}
while (i <= A->nums) {
C->data[k] = A->data[i];
++i;
++k;
}
while (j <= B->nums) {
C->data[k] = B->data[j];
++j;
++k;
}
C->nums = k - 1;
}
// 稀疏矩阵相减
void SubSparseMatrix(const SparseMatrix *A, const SparseMatrix *B, SparseMatrix *C) {
int i = 1, j = 1, k = 1;
if (A->rows != B->rows || A->cols != B->cols) {
printf("两个矩阵的行数或列数不相等,无法相减!\n");
return;
}
C->rows = A->rows;
C->cols = A->cols;
while (i <= A->nums && j <= B->nums) {
if (A->data[i].row < B->data[j].row ||
(A->data[i].row == B->data[j].row && A->data[i].col < B->data[j].col)) {
C->data[k] = A->data[i];
++i;
} else if (A->data[i].row > B->data[j].row ||
(A->data[i].row == B->data[j].row && A->data[i].col > B->data[j].col)) {
C->data[k].row = B->data[j].row;
C->data[k].col = B->data[j].col;
C->data[k].val = -B->data[j].val;
++j;
} else {
C->data[k].row = A->data[i].row;
C->data[k].col = A->data[i].col;
C->data[k].val = A->data[i].val - B->data[j].val;
++i;
++j;
}
++k;
}
while (i <= A->nums) {
C->data[k] = A->data[i];
++i;
++k;
}
while (j <= B->nums) {
C->data[k].row = B->data[j].row;
C->data[k].col = B->data[j].col;
C->data[k].val = -B->data[j].val;
++j;
++k;
}
C->nums = k - 1;
}
// 稀疏矩阵相乘
void MultSparseMatrix(const SparseMatrix *A, const SparseMatrix *B, SparseMatrix *C) {
int i, j, k, p, q, sum;
if (A->cols != B->rows) {
printf("两个矩阵的行数或列数不匹配,无法相乘!\n");
return;
}
int *temp = (int *)malloc((B->cols + 1) * sizeof(int));
for (i = 1; i <= A->rows; ++i) {
for (p = 1; p <= B->cols; ++p) {
temp[p] = 0;
}
C->data[C->nums + 1].row = i;
k = C->nums + 1;
for (q = 1; q <= B->nums; ++q) {
if (B->data[q].row == p) {
temp[B->data[q].col] = B->data[q].val;
}
}
for (j = 1; j <= A->nums; ++j) {
if (A->data[j].row == i) {
for (p = 1, sum = 0; p <= B->cols; ++p) {
sum += temp[p] * B->data[A->data[j].col + (p - 1) * B->rows].val;
}
if (sum != 0) {
C->data[k].col = p - 1;
C->data[k].val = sum;
++k;
}
}
}
C->data[C->nums].val = k - C->nums - 1;
}
C->rows = A->rows;
C->cols = B->cols;
C->nums = k - 1;
free(temp);
}
int main() {
SparseMatrix A, B, C;
int choice;
while (1) {
printf("请选择要进行的操作:\n");
printf("1.输入稀疏矩阵\n");
printf("2.打印稀疏矩阵的三元组表\n");
printf("3.转置稀疏矩阵\n");
printf("4.稀疏矩阵相加\n");
printf("5.稀疏矩阵相减\n");
printf("6.稀疏矩阵相乘\n");
printf("7.退出程序\n");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入第一个矩阵:\n");
InputSparseMatrix(&A);
printf("请输入第二个矩阵:\n");
InputSparseMatrix(&B);
break;
case 2:
printf("第一个矩阵:\n");
PrintSparseMatrix(&A);
printf("第二个矩阵:\n");
PrintSparseMatrix(&B);
break;
case 3:
TransposeSparseMatrix(&A, &C);
printf("第一个矩阵的转置:\n");
PrintSparseMatrix(&C);
TransposeSparseMatrix(&B, &C);
printf("第二个矩阵的转置:\n");
PrintSparseMatrix(&C);
break;
case 4:
AddSparseMatrix(&A, &B, &C);
printf("两个矩阵的和:\n");
PrintSparseMatrix(&C);
break;
case 5:
SubSparseMatrix(&A, &B, &C);
printf("两个矩阵的差:\n");
PrintSparseMatrix(&C);
break;
case 6:
MultSparseMatrix(&A, &B, &C);
printf("两个矩阵的积:\n");
PrintSparseMatrix(&C);
break;
case 7:
printf("程序已退出!\n");
exit(0);
default:
printf("输入有误,请重新输入!\n");
break;
}
}
return 0;
}
```
这个代码实现了稀疏矩阵的存储表示和基本运算,包括转置、相加、相减和相乘。在运行程序时,根据提示输入需要的矩阵和操作,即可得到相应的结果。
### 回答2:
实验目的:
通过本实验,旨在让学生掌握稀疏矩阵的存储表示方法以及矩阵的基本运算方法。
实验内容:
1. 使用带行逻辑连接信息的三元组顺序表来存储稀疏矩阵。
稀疏矩阵是指矩阵中大部分元素为0的矩阵。采用三元组顺序表的存储结构,可以节省空间,只存储非零元素的值及其所在的行列信息。
2. 实现矩阵的两个基本运算:相加、相减、相乘、转置。
- 相加运算:将两个矩阵对应位置的元素相加,并将结果存储在新的矩阵中。
- 相减运算:将两个矩阵对应位置的元素相减,并将结果存储在新的矩阵中。
- 相乘运算:将两个矩阵进行相乘运算,并将结果存储在新的矩阵中。具体的矩阵相乘规则需要遵循矩阵乘法的定义。
- 转置运算:将原矩阵的行和列互换,并将结果存储在新的矩阵中。
3. 实现界面输入稀疏矩阵的三元组表示形式,同时在界面上显示运算结果的矩阵阵列形式。
当用户输入稀疏矩阵的三元组表示形式时,程序需要解析输入并将其转化为三元组顺序表的存储形式。运算结果需要用矩阵阵列形式在界面上显示,方便用户查看。
本实验旨在让学生熟悉稀疏矩阵的存储表示和基本运算,同时提高对C语言的编程能力。
### 回答3:
实验目的:掌握稀疏矩阵的存储表示和基本运算。
实验内容:
1. 使用带行逻辑连接信息的三元组顺序表存储稀疏矩阵。
2. 实现两个矩阵的相加、相减、相乘和转置运算。
3. 实现界面上输入稀疏矩阵的三元组表示形式,并在界面上以阵列形式显示运算结果的矩阵。
实验步骤:
1. 定义稀疏矩阵的三元组顺序表结构体,包括行数、列数、非零元素个数和三元组数据。
2. 创建存储稀疏矩阵的三元组顺序表,并根据用户输入的稀疏矩阵进行初始化。
3. 实现两个稀疏矩阵的相加、相减、相乘和转置运算的函数,并根据函数的返回值判断运算结果是否有效。
4. 在界面上显示运算结果的矩阵:
a. 根据运算结果创建新的稀疏矩阵三元组顺序表。
b. 遍历运算结果的表格形式,将非零元素插入到新的稀疏矩阵中。
c. 在界面上以阵列形式显示新的稀疏矩阵。
代码示例:
```c
// 稀疏矩阵的三元组顺序表结构体
typedef struct {
int row; // 行数
int col; // 列数
int count; // 非零元素个数
int data[MAX_SIZE][3]; // 三元组数据
} SparseMatrix;
// 创建稀疏矩阵
SparseMatrix createSparseMatrix(int row, int col, int count) {
SparseMatrix matrix;
matrix.row = row;
matrix.col = col;
matrix.count = count;
printf("请输入稀疏矩阵的三元组数据:\n");
for(int i=0; i<count; i++) {
scanf("%d %d %d", &matrix.data[i][0], &matrix.data[i][1], &matrix.data[i][2]);
}
return matrix;
}
// 矩阵相加运算
SparseMatrix addMatrix(SparseMatrix matrix1, SparseMatrix matrix2) {
SparseMatrix result;
// 执行相加运算的代码
return result;
}
// 矩阵相减运算
SparseMatrix subtractMatrix(SparseMatrix matrix1, SparseMatrix matrix2) {
SparseMatrix result;
// 执行相减运算的代码
return result;
}
// 矩阵相乘运算
SparseMatrix multiplyMatrix(SparseMatrix matrix1, SparseMatrix matrix2) {
SparseMatrix result;
// 执行相乘运算的代码
return result;
}
// 矩阵转置运算
SparseMatrix transposeMatrix(SparseMatrix matrix) {
SparseMatrix result;
// 执行转置运算的代码
return result;
}
// 主函数
int main() {
int row, col, count;
printf("请输入稀疏矩阵的行数、列数和非零元素个数:\n");
scanf("%d %d %d", &row, &col, &count);
SparseMatrix matrix1 = createSparseMatrix(row, col, count);
SparseMatrix matrix2 = createSparseMatrix(row, col, count);
SparseMatrix addResult = addMatrix(matrix1, matrix2);
SparseMatrix subtractResult = subtractMatrix(matrix1, matrix2);
SparseMatrix multiplyResult = multiplyMatrix(matrix1, matrix2);
SparseMatrix transposeResult = transposeMatrix(matrix1);
// 在界面上显示运算结果的矩阵
displayMatrix(addResult);
displayMatrix(subtractResult);
displayMatrix(multiplyResult);
displayMatrix(transposeResult);
return 0;
}
```
阅读全文