/*
写完这个程序 我收获很大 从0开始 边写边调试 用了两个小时
换了两个编译器 从DevC++ 到 Vs2008
这个程序的要求就是将一个二维数组(大小未知 但是行列相等) 求出对角线的元素之和 和 非对角线的元素之和
并且将之顺时针旋转90° 然后输出
用的动态分配链表 在数组旋转的时候 也是操作链表节点 而不是操作数据或者操作数组
*/
#include <iostream>
#include <iomanip>
using namespace std;
struct LinkNode
{
int row; //数组元素的行
int cloumn; //数组元素的列
int data;
LinkNode *next;
};
class DArray
{
public:
DArray(const int *p,int n);
~DArray();
int getSumOfLine();
int getSumOfArray();
void reverse();
void show();
private:
const int m;
int sumOfL;
int sumOfA;
LinkNode **point;
LinkNode *head;
};
DArray::DArray(const int *p,int n):m(n)
{
LinkNode *pLink,*q;
int i,j;
point = new LinkNode*[n];
head = new LinkNode;
pLink = head;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
{ pLink->row = i;
pLink->cloumn = j;
pLink->data = *(p++);
pLink->next = new LinkNode;
q = pLink;
pLink = pLink->next;
}
delete pLink;
q->next = NULL;
sumOfL = 0;
sumOfA = 0;
}
DArray::~DArray()
{
LinkNode *p,*q;
p = head;
while(p!= NULL)
{
q = p->next;
delete p;
p = q;
}
delete []point;
}
int DArray::getSumOfLine()
{
LinkNode *p;
p = head;
while(p != NULL)
{
if((p->row == p->cloumn)||(p->row + p->cloumn == m-1))
{sumOfL += p->data;}
p = p->next;
}
return sumOfL;
}
int DArray::getSumOfArray()
{
LinkNode *p;
p = head;
while(p != NULL)
{
if(!((p->row == p->cloumn)||(p->row + p->cloumn ==m-1)))
{sumOfA += p->data;}
p = p->next;
}
return sumOfA;
}
void DArray::reverse()
{
LinkNode *q,*r;
int temp,i=0;
q = head;
while(q != NULL)
{
if(q->cloumn == 0)
{
point[i++] = q;
if(i != 1)r->next = NULL;
}
r = q;
q = q->next;
}
/*for(i = 0; i < m; i++)
cout<<point[i]->data<<" ";*/
head = point[m-1];
do{
for(i = m-1; i >= 0; i--)
{
temp = point[i]->row;
point[i]->row = point[i]->cloumn;
point[i]->cloumn = m - temp - 1;
q = point[i];
point[i] = point[i]->next;
if(i != 0)
{
q->next = point[i-1];
}else{
q->next = point[m-1];
}
}
}while(point[0] != NULL);
}
void DArray::show()
{
LinkNode *p;
p = head;
while(p != NULL )
{
cout<<setw(4)<<p->data<<" ";
if(p->cloumn == m-1)
cout<<endl;
p = p->next;
}
}
int main(int argc, char *argv[])
{
int b[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,17}};
DArray mtx(b[0],4);
cout<< mtx.getSumOfLine()<<endl;
cout<< mtx.getSumOfArray()<<endl;
mtx.show();
mtx.reverse();
mtx.show();
system("PAUSE");
return EXIT_SUCCESS;
}