/******************************** * * 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; }