/******************************** * * c++程序設計實踐指導 * * 1.2二維數組的操做運算 * *********************************/ #include <iostream> using namespace std; class MATRIX { struct LinkNode //定義二維數組數據結構體 { int Row; //存放行號 int Column; //存放列號 int Data; //存放二維數組對應行號和列號中的數 LinkNode *Next; //指向下一個節點的指針 }; int m; //存放行列值 int sum1; //存放非對角線和值 int sum2; //存放主對角線和值 LinkNode *head; //單鏈表頭結點 public: MATRIX(int x[][40], int k) //構造函數,用k初始化m,建立單鏈表,爲每個節點加入行號、列號、數值 { m = k; head = new LinkNode; //爲頭結點分配存儲空間 LinkNode *p = head; for(int i = 0; i < k; i++) { for(int j = 0; j < k; j++) { LinkNode *q = new LinkNode; p->Next = q; p = q; q->Row = i; q->Column = j; q->Data = x[i][j]; } } p->Next = NULL; //最後一個節點的下節點指針爲空,表示鏈表到此結束 sum1 = 0; //和值初始值爲0 sum2 = 0; } void process(); //完成求和功能 void reverse(); //完成任意二維數組順時針旋轉90度的功能 void show() //在屏幕顯示結果 { LinkNode *p = head->Next; while(p) { cout << p->Data << "\t"; if(p->Column == m - 1) cout << endl; p = p->Next; } cout << "非對角線和值爲: " << sum1 << endl; cout << "主對角線和值爲: " << sum2 << endl; } }; void MATRIX::process() //完成求和功能 { LinkNode *p = head->Next; while(p->Next) { while((p->Row == p->Column) || (p->Row + p->Column == m - 1)) { if(p->Row == p->Column) //主對角線上元素求和 sum2 += p->Data; p = p->Next; } sum1 += p->Data; //非對角線上元素求和 p = p->Next; } sum2 += p->Data; //最後一個主對角線上的元素補上 } void MATRIX::reverse() //完成任意二維數組順時針旋轉90度的功能 { LinkNode *p = head->Next; int c[40][40]; //存放旋轉後的數組 int vRow = 0; //存放結果數組的行號 int vColumn; //存放結果數組的列號 cout << "順時針旋轉後的二維數組:" << endl; while(p->Next) //用單鏈表初始化結果數組 { vColumn = m - 1 - (p->Row); c[vRow][vColumn] = p->Data; vRow++; vRow = vRow % 4; p = p->Next; } c[m - 1][0] = p->Data; //最後一個元素手動補上 for(int i = 0; i < m; i++) //結果數組輸出到屏幕顯示 { for(int j = 0; j < m; j++) { cout << c[i][j] << "\t"; } cout << endl; } } int main() { int b[40][40] = {{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}}; MATRIX mtx(b, 4); mtx.process(); mtx.show(); mtx.reverse(); system("pause"); return 0; }