二维数组的操作运算

//编写一个通用程序,求出二维数组(行数和列数必须相等)的非对角线元素之和,即求
//两条对角线之外的元素之和。(没有使用类的方法)
/*#include<iostream>
using namespace std;

int main()
{
 int num1;//行数与列数
  
 int i,j,k;
 
 cout<<"请输入行数与列数:";
 cin>>num1;
 
 //为二维数组开辟空间
 int **p=new int*[num1];
 for(i=0;i<num1;i++)
  p[i]=new int[num1];
 
 cout<<"请输入该数组的值:";
 for(j=0;j<num1;j++)
  for(int k=0;k<num1;k++)
   cin>>p[j][k];

 cout<<"该数组的值为:"<<endl;
 for(j=0;j<num1;j++)
 { for(k=0;k<num1;k++)
   cout<<p[j][k]<<"\t";
  cout<<endl;
 }
 int sum=0;
 for (i=0;i<num1;i++)
  for (j=0;j<num1;j++)
   if (i!=j&&(i+j)!=num1-1)
    sum+=p[i][j];
 cout<<"该数组非对角戏元素和为:"<<sum<<endl;
 //释放二维数组占用的空间
 for(int m=0;m<num1;m++)
  delete[] p[m];
 delete[] p;
 return   0;
}*/

//编写一个通用程序,求出二维数组(行数和列数必须相等)的非对角线元素之和,即求
//两条对角线之外的元素之和。试建立一个类MATRIX,用于完成该功能。
//该程序中实现了动态二位数组,**p与**a.
/*#include<iostream>
using namespace std;

class MATRIX{
public:
 MATRIX(int **p,int size){
  m=size;
  //在类中建立动态二维数组
  a=new int*[m];
  for(int i=0;i<m;i++)
   a[i]=new int[m];
  for(j=0;j<m;j++)
   for(int k=0;k<m;k++)
    a[j][k]=p[j][k];
 }
 void show(){
  cout<<"该数组的值为:"<<endl;
  for(j=0;j<m;j++)
  { for(k=0;k<m;k++)
    cout<<a[j][k]<<"\t";
   cout<<endl;
  }
 }
 void count(){
  int sum=0;
  for (j=0;j<m;j++)
   for (k=0;k<m;k++)
    if (j!=k&&(k+j)!=m-1)
     sum+=a[j][k];
 cout<<"该数组非对角戏元素和为:"<<sum<<endl;
 }
private:
 int **a;
 int j,k,m;
};
int main()
{
 int num1;//行数
  
 int i,j,k;
 
 cout<<"请输入行数与列数:";
 cin>>num1;
 
 //为二维数组开辟空间
 int **p=new int*[num1];
 for(i=0;i<num1;i++)
  p[i]=new int[num1];
 
 cout<<"请输入该数组的值:";
 for(j=0;j<num1;j++)
  for(int k=0;k<num1;k++)
   cin>>p[j][k];
 MATRIX b(p,num1);
 b.show();
 b.count();
 //释放二维数组占用的空间
 for(int m=0;m<num1;m++)
  delete[] p[m];
 delete[] p;
 return   0;
}*/

//修改程序设计要求,求出任意二维数组的对角线的数据之和。求出任意二维数组的非对角线元素之和。(行列必须相等)
/*#include<iostream>
using namespace std;

class MATRIX{
public:
 MATRIX(int **p,int size){
  m=size;
  //在类中建立动态二维数组
  a=new int*[m];
  for(int i=0;i<m;i++)
   a[i]=new int[m];
  for(j=0;j<m;j++)
   for(int k=0;k<m;k++)
    a[j][k]=p[j][k];
 }
 void show(){
  cout<<"该数组的值为:"<<endl;
  for(j=0;j<m;j++)
  { for(k=0;k<m;k++)
  cout<<a[j][k]<<"\t";
  cout<<endl;
  }
 }
 void count(){
  int sum=0;
  for (j=0;j<m;j++)
   for (k=0;k<m;k++)
    if (j!=k&&(k+j)!=m-1)
     sum+=a[j][k];
    cout<<"该数组非对角戏元素和为:"<<sum<<endl;
 }
 void count1(){
  int sum1=0;
  for (j=0;j<m;j++)
   for (k=0;k<m;k++)
    if (j==k||(k+j)==m-1)
     sum1+=a[j][k];
    cout<<"该数组对角戏元素和为:"<<sum1<<endl;
 }
private:
 int **a;
 int j,k,m;
};
int main()
{
 int num1;//行数
 
 int i,j,k;
 
 cout<<"请输入行数与列数:";
 cin>>num1;
 
 //为二维数组开辟空间
 int **p=new int*[num1];
 for(i=0;i<num1;i++)
  p[i]=new int[num1];
 
 cout<<"请输入该数组的值:";
 for(j=0;j<num1;j++)
  for(int k=0;k<num1;k++)
   cin>>p[j][k];
 MATRIX b(p,num1);
 b.show();
 b.count();
 b.count1();
 //释放二维数组占用的空间
 for(int m=0;m<num1;m++)
  delete[] p[m];
 delete[] p;
 return   0;
}*/
//将输入的任意二维数组顺时针旋转90°输出。(行列相等的情况)
/*#include<iostream>
using namespace std;

class MATRIX{
public:
 MATRIX(int **p,int size){
  m=size;
  //在类中建立动态二维数组
  a=new int*[m];
  for(int i=0;i<m;i++)
   a[i]=new int[m];
  b=new int*[m];
  for(i=0;i<m;i++)
   b[i]=new int[m];
  for(j=0;j<m;j++)
   for(int k=0;k<m;k++)
    a[j][k]=p[j][k];
 }
 void show(){
  cout<<"该数组的值为:"<<endl;
  for(j=0;j<m;j++)
  { for(k=0;k<m;k++)
  cout<<a[j][k]<<"\t";
  cout<<endl;
  }
 }
 void show1(){
  cout<<"该数组旋转90°后为:"<<endl;
  for(j=0;j<m;j++)
  { 
   for(k=0;k<m;k++)
   { 
    b[j][k]=a[m-1-k][j];
    cout<<b[j][k]<<"\t";
   }
   cout<<endl;
  }
 }
private:
 int **a,**b;
 int j,k,m;
};
int main()
{
 int num1;//行数
 
 int i,j,k;
 
 cout<<"请输入行数与列数:";
 cin>>num1;
 
 //为二维数组开辟空间
 int **p=new int*[num1];
 for(i=0;i<num1;i++)
  p[i]=new int[num1];
 
 cout<<"请输入该数组的值:";
 for(j=0;j<num1;j++)
  for(int k=0;k<num1;k++)
   cin>>p[j][k];
  MATRIX b(p,num1);
  b.show();
  b.show1();
 //释放二维数组占用的空间
 for(int m=0;m<num1;m++)
  delete[] p[m];
 delete[] p;
 return   0;
}*/
//将输入的任意二维数组顺时针旋转90°输出。(行列不相等的情况)
/*#include<iostream>
using namespace std;

class MATRIX{
public:
 MATRIX(int **p,int size,int size1){
  m=size;n=size1;
  //在类中建立动态二维数组
  a=new int*[m];
  for(int i=0;i<m;i++)
   a[i]=new int[n];
  b=new int*[n];
  for(i=0;i<n;i++)
   b[i]=new int[m];
  for(j=0;j<m;j++)
   for(int k=0;k<n;k++)
    a[j][k]=p[j][k];
 }
 void show(){
  cout<<"该数组的值为:"<<endl;
  for(j=0;j<m;j++)
  { for(k=0;k<n;k++)
  cout<<a[j][k]<<"\t";
  cout<<endl;
  }
 }
 void show1(){
  cout<<"该数组旋转90°后为:"<<endl;
  for(j=0;j<n;j++)
  { 
   for(k=0;k<m;k++)
   { 
    b[j][k]=a[m-1-k][j];
    cout<<b[j][k]<<"\t";
   }
   cout<<endl;
  }
 }
private:
 int **a,**b;
 int j,k,m,n;
};
int main()
{
 int num1,num2;//行数
 
 int i,j,k;
 
 cout<<"请输入行数与列数:";
 cin>>num1>>num2;
 
 //为二维数组开辟空间
 int **p=new int*[num1];
 for(i=0;i<num1;i++)
  p[i]=new int[num2];
 
 cout<<"请输入该数组的值:";
 for(j=0;j<num1;j++)
  for(int k=0;k<num2;k++)
   cin>>p[j][k];
  MATRIX b(p,num1,num2);
  b.show();
  b.show1();
 //释放二维数组占用的空间
 for(int m=0;m<num1;m++)
  delete[] p[m];
 delete[] p;
 return   0;
}*/
//用单向链表实现二维数组的操作运算
/*#include<iostream>
#include<iomanip>

using namespace std;

struct ArrayNode
{
    int row;
    int column;
    int data;
    ArrayNode *next;
};

ArrayNode *createArray(int n);//用单向链表创建二维数组
void getArrayData(int n,ArrayNode *head);//显示二维数组各元素
int arrayDiagonal(int n,ArrayNode *head);//求二维数组对角线之和
int arraySum(ArrayNode *head);//求二维数组总和
void outputSpinArray(int n,ArrayNode *head);//数组顺时针旋转90度后输出

int main()
{
    ArrayNode *ListHead=NULL;
    int n;
    cout<<"请输入二维数组的行数(已知行数与列数相等):"<<endl;//二维数组行列相等,总元素个数就等于n*n
    cin>>n;
    if(n>1)
    {
        ListHead=createArray(n);
        cout<<"您输入的二维数组为:"<<endl;
        getArrayData(n,ListHead);
        cout<<"此二维数组的对角线之和为:"<<arrayDiagonal(n,ListHead)<<endl;
        cout<<"此二维数组的非对角线之和为:";
        cout<<arraySum(ListHead)-arrayDiagonal(n,ListHead)<<endl;
        cout<<"此数组顺时针旋转90度后为:"<<endl;
        outputSpinArray(n,ListHead);
    }
    else
        cout<<"二维数组的行数不能小于2!"<<endl;
    return 0;
}
//用单向链表创建二维数组
ArrayNode *createArray(int n)
{
    ArrayNode *head=NULL,*tail=NULL,*temp=NULL;
    int num;
 cout<<"请输入单链表创建的二维数组的数值:"<<endl;
    cin>>num;
    head=new ArrayNode;
    if(head==NULL)
    {
        cerr<<"no memory available!"<<endl;
        return NULL;//改为return head也是对的.
    }
    else
    {
        head->data=num;
        head->row=1;//数组行列均从1开始计数
        head->column=1;
        head->next=NULL;
        tail=head;
    }
    for(int i=2,j=1,k=1;k<=n*n-1;i++,k++)//i为列数,j为行数,k用来计算输入的总个数
    {
        cin>>num;
        temp=new ArrayNode;
        if(temp==NULL)
        {
            cerr<<"no memory available!"<<endl;
            return head;
        }
        else
        {
            temp->data=num;
            temp->row=j;
            //cout<<"j: "<<j<<endl;//调试用
            temp->column=i;
            //cout<<"i: "<<i<<endl;//调试用
            temp->next=NULL;
            tail->next=temp;
            tail=temp;
            if((k+1)%n==0)
                j++;
            if(i%n==0)
                i=0;
            //cout<<endl;
        }
    }
    return head;
}
//显示二维数组各元素
void getArrayData(int n,ArrayNode *head)
{
    ArrayNode *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,ArrayNode *head)
{
    ArrayNode *p=head;
    int sum=0;
    while(p)
    {
        if((p->row==p->column)||(p->row+p->column==n+1))//行列都从1开始,所以行数+列数=n+1是第二条对角线上的元素
            sum+=p->data;
        p=p->next;
    }
    return sum;
}
//求二维数组总和
int arraySum(ArrayNode *head)
{
    ArrayNode *p=head;
    int sum=0;
    while(p)
    {
        sum+=p->data;
        p=p->next;
    }
    return sum;
}
//数组顺时针旋转90度后输出
//思路:
//旋转前:
//   1    2     3     4
//   5    6     7     8
//   9   10  11   12
//  13  14  15  16
//旋转后:
//  13   9    5   1
//  14  10   6   2
//  15  11   7   3
//  16  12   8   4
//行列均从1开始计数
//可以看到先输出4行1列的数,再输出3行1列..2行1列..1行1列
//之后行数再从4开始,列数则加1..
//推广到n后
//n行1列..n-1行1列..n-2行1列..1行1列
//n行2列..n-1行2列..n-2行2列..1行2列
//n行n列..n-1行n列..n-2行n列..1行n列
//编程先找到n行1列进行输出,之后每找到符合条件的输出一个
//因为是链表要考虑到循环输出,当输出所有n*n个数后跳出循环
void outputSpinArray(int n,ArrayNode *head)
{
    ArrayNode *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;

}*/
//用单链表形式代替二维数组,实现非对角线元素之和。(行列数必须相等)
#include<iostream>
using namespace std;

struct LinkNote{
 int Row;//行数
 int Column;//列数
 int Data;
 LinkNote *next;
};
LinkNote *creatLink(int n);//用单向链表创建二维数组
void getArrayData(int n,LinkNote *head);//显示二维数组各元素
int arrayDiagonal(int n,LinkNote *head);//求二维数组对角线之和
int arraySum(int n,LinkNote *head);//求二维数组非对角线元素总和
void outputSpinArray(int n,LinkNote *head);//二维数组顺时针旋转90°
int main()
{
 LinkNote *Linkhead=NULL;
 int num,sum1,sum2;
 cout<<"请输入要创建二维数组的维数:"<<endl;
 cin>>num;
 Linkhead=creatLink(num);
 cout<<"您输入的二维数组为:"<<endl;
 getArrayData(num,Linkhead);
 cout<<"二维数组的对角线之和为:";
 sum1=arrayDiagonal(num,Linkhead);
 cout<<sum1<<endl;
 cout<<"二维数组的非对角线之和为:";
 sum2=arraySum(num,Linkhead);
 cout<<sum2<<endl;
 cout<<"二维数组顺时针旋转90°后为:"<<endl;
 outputSpinArray(num,Linkhead);
 return  0;
}
LinkNote *creatLink(int n){
 LinkNote *head=NULL,*tail=NULL,*temp=NULL;
 head=new LinkNote;
 int num;
 cout<<"请输入单链表创建的二维数组的数值:"<<endl;
 cin>>num;
 if (head==NULL)
 {
  cout<<"输入的节点不存在,请重新输入."<<endl;
  return NULL;
 }
 else
 {
  head->Data=num;
  head->Row=1;
  head->Column=1;
  head->next=NULL;
  tail=head;
 }
 for (int i=2,j=1,k=1;k<=n*n-1;i++,k++)//i代表列数,j代表行数,k代表输入的总个数
 {
  temp=new LinkNote;
  tail->next=temp;
  if (temp==NULL)
  {
   cout<<"输入的节点不存在,请重新输入."<<endl;
   return head;
  }
  cin>>num;
  temp->Data=num;
  temp->Column=i;
  temp->Row=j;
  temp->next=NULL;
  tail=temp;
  if(i%n==0)//也可写为k+1%n==0;
   j++;
  if(i%n==0)
   i=0;
 }
 return head;
}
void getArrayData(int n,LinkNote *head){
 LinkNote *put;
 put=head;
 while(put){
  if (put->Row<=n&&put->Column<=n)
  {
   cout<<put->Data<<" ";
   if(put->Column%n==0)
    cout<<endl;
   put=put->next;
  }
 } 
}
int arrayDiagonal(int n,LinkNote *head){
 LinkNote *p;
 p=head;
 int sum1=0;
 while(p){
  if ((p->Row==p->Column)||(p->Column+p->Row==n+1))
   sum1+=p->Data;
  p=p->next;
 }
 return sum1;
}
int arraySum(int n,LinkNote *head){
 int sum2=0;
 LinkNote *p;
 p=head;
 while(p){
  if ((p->Row!=p->Column)&&((p->Column+p->Row)!=n+1))
   sum2+=p->Data;
  p=p->next;
 }
 return sum2;
}
void outputSpinArray(int n,LinkNote *head){
 LinkNote *p=head;
 int m=n,i=1,count=0,space=0;
 while(1)
 {
  while(p)
  {
   if (p->Row==m&&p->Column==i)
   {
    cout<<p->Data<<" ";
    count++;
    space++;
    m--;
   }
   if (space==n)
   {
    i++;
    cout<<endl;
    m=n;
    space=0;
   }
   p=p->next;
  }
  if(count==n*n)
   break;//防止死循环
  p=head;//因为P不是从第一个连续执行的,所以每次循环完需要回到表头继续执行
 }
 cout<<endl;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值