二维数组操作运算

编写一个通用程序,求出二维数组的非对角线元素之和,即求两条对角线之外的元素之和。

#pragma once
#include<iostream>
using namespace std;
class MATRIX
{
public:
    MATRIX();
    MATRIX(int x[][40], int k);
    void process();
    void show();
    ~MATRIX();
private:
    int m;
    int sum;
    int a[40][40];
};
#include "MATRIX.h"


MATRIX::MATRIX()
{
}
MATRIX::MATRIX(int x[][40], int k)
{
    m = k;
    for (int i = 0; i < k; i++)
        for (int j = 0; j < k; j++)
        {
            a[i][j] = x[i][j];
        }
    sum = 0;
}
void MATRIX::show()
{
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cout << a[i][j] << "\t";
        }
        cout << endl;
    }
    cout << "sum=" << sum << endl;
}
void MATRIX::process()
{
    int i,j;
    for (i = 0; i < m; i++)
        for (j = 0; j < m; j++)
        {
            if ((i == j) || ((i + j) == (m - 1)))
            {
                continue;
            }
            sum += a[i][j];
        }
}

MATRIX::~MATRIX()
{
}

#include"MATRIX.h"

int main()
{
    int b[40][40] = { { 1, 1, 1, 1 }, { 1, 2, 2, 1 }, { 1, 2, 2, 1 }, {1,1,1,1} };
    MATRIX mtx(b, 4);
    mtx.process();
    mtx.show();
    return 0;
}

将二维数组改为数据结构的程序实现改写为单向链表结构来表示二维数组可定位为数据结构体。代码如下:

#include<iostream>
#include<iomanip>
using namespace std;
struct LinkNode{
    int Row;
    int Column;
    int Data;
    LinkNode *Next;
};
LinkNode *createArray(int n);
void getArrayData(int n, LinkNode *head);
int arrayDiagonal(int n, LinkNode *head);
int arraySum(LinkNode *head);
void outputSpinArray(int n, LinkNode *head);
int main()
{
    LinkNode *ListHead = NULL;
    int n;
    cout << "请输入行数和列数:";
    cin >> n;
    if (n > 1)
    {
        ListHead = createArray(n);
        cout << "输入的二维数组:" << endl;
        getArrayData(n, ListHead);
        cout << "此数组的对角线之和:" << arrayDiagonal(n, ListHead) << endl;
        cout << "非对角线之和:" << arraySum(ListHead) - arrayDiagonal(n, ListHead) << endl;
        cout << "数组顺时针旋转后的角度为:" << endl;
        outputSpinArray(n, ListHead);
    }
    return 0;
}
LinkNode *createArray(int n)
{
    LinkNode *head = NULL, *tail = NULL, *temp = NULL;
    int num;
    cin >> num;
    head = new LinkNode;
    if (head == NULL)
    {
        cerr << "no memory availble" << endl;
    }
    else
    {
        head->Data = num;
        head->Row = 1;
        head->Column = 1;
        head->Next = NULL;
        tail = head;
    }
    //i为列数,j为行数,k用来计算输入的总个数。
    for (int i = 2, j = 1, k = 1; k <=n*n - 1; i++, k++)
    {
        cin >> num;
        temp = new LinkNode;
        if (temp == NULL)
        {
            cerr << "No memory availablel" << endl;
            return head;
        }
        else
        {
            temp->Data = num;
            temp->Row = j;
            temp->Column = i;
            temp->Next = NULL;
            tail->Next = temp;
            tail = temp;
            if ((k + 1) % n == 0)
            {
                j++;
            }
            if (i%n == 0)
                i = 0;
        }
    }
    return head;
}
void  getArrayData(int n, LinkNode *head)
{
    LinkNode *put = head;
    int i = 0;
    while (put)
    {
        if (put->Row <= n && put->Column <= n)
        {
            cout << setw(4) << put->Data;
            i++;
        }
        if (i%n == 0)
            cout << endl;
        put = put->Next;
    }
    cout << endl;

}
int arrayDiagonal(int n, LinkNode *head)
{
    LinkNode *p = head;
    int sum = 0;
    while (p)
    {
        if ((p->Row == p->Column) || (p->Row + p->Column == n + 1))
        {
            sum += p->Data;
        }
        p = p->Next;
    }
    return sum;
}
int arraySum(LinkNode *head)
{
    LinkNode *p = head;
    int sum = 0;
    while (p)
    {
        sum += p->Data;
        p = p->Next;
    }
    return sum;
}
void outputSpinArray(int n, LinkNode *head)
{
    LinkNode *p = head;
    int i = 1, count = 0, space = 0, m = n;
    while (1)
    {
        while (p)
        {
            if (p->Row == m && p->Column == i)
            {
                cout << setw(4) << p->Data;
                count++;
                space++;
                m--;
            }
            if (space == n)
            {
                i++;
                m = n;
                space = 0;
                cout << endl;
            }
            p = p->Next;
        }
        if (count == n*n)
        {
            break;
        }
        p = head;
    }
    cout << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值