/********************************
*
* 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;
}
转载于:https://my.oschina.net/u/862938/blog/110515