一个C++数组的操作

/*
写完这个程序 我收获很大 从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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值