稀疏矩阵的加法、减法、转置运算

来源:互联网 发布:iscroll.js中文官网 编辑:程序博客网 时间:2024/05/22 20:03
一.问题描述
以三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减、转置运算,再以矩阵的形式将其结果输出。
二.实现提示
1. 首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否匹配。
2. 程序可以对三元组的输入顺序加以限制,例如,按行优先形式输入三元组。

三.源代码

#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100typedef int ElementType;typedef struct{int row, col;ElementType value;}Triple;typedef struct{Triple data[MAXSIZE + 1];int rows, cols, length;}TSMatrix;void Input(TSMatrix *A, int arr[MAXSIZE][MAXSIZE]){int i, j;//将矩阵元素全部初始化为0for(i = 0; i < MAXSIZE; i++){for(j = 0; j < MAXSIZE; j++)arr[i][j] = 0;}printf("请输入三元组的行数 列数 元素个数: \n");scanf("%d%d%d", &A->rows, &A->cols, &A->length);printf("请输入三元组的元素row col value\n");for(i = 1; i <= A->length; i++){scanf("%d%d%d", &A->data[i].row, &A->data[i].col, &A->data[i].value);arr[A->data[i].row][A->data[i].col] = A->data[i].value;}}void Output(TSMatrix *A, int arr[MAXSIZE][MAXSIZE]){int i,j;for(i = 1; i <= A->rows; i++){for(j = 1; j <= A->cols; j++)printf("%3d", arr[i][j]);printf("\n");}printf("\n");}TSMatrix *Opposite(TSMatrix *A){int i;TSMatrix *D;D = (TSMatrix *)malloc(sizeof(TSMatrix));D->rows = A->rows;D->cols = A->cols;D->length = A->length;for(i = 1; i <= A->length; i++){D->data[i].row = A->data[i].row;D->data[i].col = A->data[i].col;D->data[i].value = -A->data[i].value;}return D;}TSMatrix *Add(TSMatrix *A, TSMatrix *B,int arr[MAXSIZE][MAXSIZE]){int i, j, k = 1;TSMatrix *C;C = (TSMatrix *)malloc(sizeof(TSMatrix));//将矩阵元素全部初始化为0for(i = 0; i < MAXSIZE; i++){for(j = 0; j < MAXSIZE; j++)arr[i][j] = 0;}i = 1; j = 1;if(A->rows == B->rows && A->cols == B->cols){C->length = 0;C->rows = A->rows;C->cols = A->cols;while(i <= A->length && j <= B->length){if(A->data[i].row < B->data[j].row){C->data[k].row = A->data[i].row;C->data[k].col = A->data[i].col;C->data[k].value = A->data[i].value;arr[C->data[k].row][C->data[k].col] = C->data[k].value;C->length ++;i++;k++;}else if(A->data[i].row > B->data[j].row){C->data[k].row = B->data[j].row;C->data[k].col = B->data[j].col;C->data[k].value = B->data[j].value;arr[C->data[k].row][C->data[k].col] = C->data[k].value;C->length ++;j++;k++;}else{if(A->data[i].col < B->data[j].col){C->data[k].row = A->data[i].row;C->data[k].col = A->data[i].col;C->data[k].value = A->data[i].value;arr[C->data[k].row][C->data[k].col] = C->data[k].value;C->length ++;i++;k++;}else if(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].value = B->data[j].value;arr[C->data[k].row][C->data[k].col] = C->data[k].value;C->length ++;j++;k++;}else{if(A->data[i].value + B->data[j].value == 0){i++;j++;}else{C->data[k].row = A->data[i].row;C->data[k].col = A->data[i].col;C->data[k].value = A->data[i].value + B->data[j].value;arr[C->data[k].row][C->data[k].col] = C->data[k].value;i++;j++;k++;}}}}while(i > A->length && j <= B->length){C->data[k].row = B->data[j].row;C->data[k].col = B->data[j].col;C->data[k].value = B->data[j].value;arr[C->data[k].row][C->data[k].col] = C->data[k].value;C->length ++;j++;k++;}while(i <= A->length && j > B->length){C->data[k].row = A->data[i].row;C->data[k].col = A->data[i].col;C->data[k].value = A->data[i].value;arr[C->data[k].row][C->data[k].col] = C->data[k].value;C->length ++;i++;k++;}}else{printf("三元组A与三元组B不符合三元组相加的条件!\n");}return C;}TSMatrix *Transpose(TSMatrix *A, int arr[MAXSIZE][MAXSIZE]){TSMatrix *D;int num[MAXSIZE], position[MAXSIZE];int i, j, k, m;//将矩阵元素全部初始化为0for(i = 0; i < MAXSIZE; i++){for(j = 0; j < MAXSIZE; j++)arr[i][j] = 0;}D = (TSMatrix *)malloc(sizeof(TSMatrix));D->rows = A->cols;D->cols = A->rows;D->length = A->length;if(D->length){for(i = 1; i <= A->cols; i++)num[i] = 0;for(j = 1; j <= A->length; j++)num[A->data[j].col]++;position[1] = 1;for(i = 2; i <= A->cols; i++)position[i] = position[i - 1] + num[i - 1];for(k = 1; k <= A->length; k++){i = A->data[k].col;m = position[i];D->data[m].row = A->data[k].col;D->data[m].col = A->data[k].row;D->data[m].value = A->data[k].value;arr[D->data[m].row][D->data[m].col] = D->data[m].value;position[i]++;}}return D;}main(){TSMatrix *A, *B, *C;int arr[MAXSIZE][MAXSIZE] = {0};A = (TSMatrix *)malloc(sizeof(TSMatrix));B = (TSMatrix *)malloc(sizeof(TSMatrix));/*三元组A的输入,输出*/Input(A, arr);printf("\n三元组A对应的矩阵为:\n");Output(A, arr);/*三元组B的输入,输出*/Input(B, arr);printf("\n三元组B对应的矩阵为:\n");Output(B, arr);/*矩阵相加*/C = Add(A, B, arr);printf("\n矩阵相加后为:\n");Output(C, arr);//矩阵相减C = Add(A, Opposite(B), arr);printf("\n矩阵相减后为:\n");Output(C, arr);//转置printf("A矩阵转置后为:\n");Output(Transpose(A,arr), arr);printf("B矩阵转置后为:\n");Output(Transpose(B,arr), arr);}



1 0
原创粉丝点击