資料結構 稀疏矩陣的加減運算
阿新 • • 發佈:2018-11-11
思路:
首先是要了解矩陣的加減運演算法則,即同坐標的進行加減 ,所以只需要將兩個矩陣中相同的點進行加減,不同的只需要在三元陣列中,要一個新的空間進行儲存即可
#include<iostream> using namespace std; typedef struct Node { int row; // 行 int col; // 列 int data; }Node; void initList(Node *, int); // 初始化三元陣列 int inputList(Node *, int[][3], int, int); // 將 稀疏矩陣的資料存入三元陣列中 void printList(Node *, int); // 列印三元陣列 void transpositionList(Node * list, int); // 矩陣的轉置 void sort(Node *, int); // 矩陣轉置後的對 行 進行排序 void puls(Node *, int&, Node *, int); // 矩陣相加,結果為 前一個矩陣 int check(Node *, int,int ,int ); // 在第二個矩陣中 查詢 和 第一個矩陣相同的位置座標,並返回 資料 void Minus(Node *, int&, Node *, int); // 矩陣相減,結果為 前一個矩陣 int main(void) { int arr1[5][3] = { {0,0,1}, {2,0,0}, {0,3,0}, {4,0,0}, {5,0,0} }; Node list1[5 * 3]; initList(list1, 15); int len1 = inputList(list1, arr1, 5, 3); cout << "第一個轉置前:" << endl; printList(list1, len1); transpositionList(list1, len1); cout << "第一個轉置後:" << endl; printList(list1, len1); cout << "=======================" << endl; int arr2[5][3] = { {0,0,1}, {2,0,0}, {0,3,0}, {4,0,0}, {5,0,1} }; Node list2[5 * 3]; initList(list2, 15); int len2 = inputList(list2, arr2, 5, 3); cout << "第二個轉置前:" << endl; printList(list2, len2); transpositionList(list2, len2); cout << "第二個轉置後:" << endl; printList(list2, len2); cout << "=======================" << endl; cout << "矩陣相加:" << endl; puls(list1, len1, list2, len2); printList(list1, len1); cout << "=======================" << endl; cout << "矩陣相減:" << endl; Minus(list1, len1, list2, len2); printList(list1, len1); return 0; } // 在一個儲存中查詢相同座標的點,並返回這個點的資料域部分,並且將此資料域改為 0 ,以便兩個矩陣有不相交的點的運算 int check(Node * list2, int len2, int row, int col) { for (int i = 0; i < len2; i++) { if (list2[i].row == row && list2[i].col == col) { int tmpNumber = list2[i].data; list2[i].data = 0; return tmpNumber; } } return 0; } void Minus(Node * list1, int& len1, Node * list2, int len2) { for (int i = 0; i < len1; i++) { list1[i].data -= check(list2, len2, list1[i].row, list1[i].col); //cout << check(list2, len2, list1[i].row, list1[i].col) << " "; } for (int i = 0; i < len2; i++) { if (list2[i].data != 0) { list1[len1] = list2[i]; list1[len1].data = -list1[len1].data; len1++; } } sort(list1, len1); } void puls(Node * list1, int& len1, Node * list2, int len2) { for (int i = 0; i < len1;i ++) { list1[i].data += check(list2, len2, list1[i].row, list1[i].col); } for (int i = 0; i < len2; i++) { if (list2[i].data != 0) { list1[len1++] = list2[i]; } } sort(list1,len1); } void printList(Node * list, int n) { for (int i = 0; i < n; i++) { if (list[i].data != 0) { cout << list[i].row << " " << list[i].col << " " << list[i].data << endl; } } cout << endl; } void transpositionList(Node * list, int len) { for (int i = 0; i < len; i++) { int tmp = list[i].row; list[i].row = list[i].col; list[i].col = tmp; } sort(list, len); } void sort(Node * list, int len) { for (int i = 1; i < len; i++) { for (int j = 0; j < len - i; j++) { if (list[j].row > list[j + 1].row) { Node tmp = list[j]; list[j] = list[j + 1]; list[j + 1] = tmp; } } } } int inputList(Node * list, int a[][3], int row, int col) { int count = 0; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (a[i][j] != 0) { list[count].row = i; list[count].col = j; list[count++].data = a[i][j]; } } } return count; } void initList(Node * list, int n) { int i; for (i = 0; i < n; i++) { list[i].col = 0; list[i].row = 0; list[i].data = 0; } }