用C语言编写一个矩阵转置的函数,矩阵的行数和列数在程序中由用户输入,请问怎么写,非常感谢

如题所述

我的代码逻辑是:

矩阵行指针初值指向每行首地址,迭代依次取所有行指针指向值组成新行,所有行指针自增。最终组合新的矩阵。

#include <stdio.h>
#include <malloc.h>
int **getList(int row,int clo);//获取矩阵地址空间
void setNum(int **nList,int n);//填写数值
void prtList(int **nList,int row,int clo);//打印矩阵
int **zz(int **nList,int row,int clo);//转置函数

int main()
{
    int row,clo,**nList=NULL,**nListSave=NULL;

    printf("输入矩阵行列数:");
    scanf("%d%d",&row,&clo);
    nList=getList(row,clo);
    setNum(nList,row*clo);

    printf("输入的矩阵为:\n");
    prtList(nList,row,clo);

    printf("转置后的矩阵为:\n");
    nListSave=zz(nList,row,clo);
    free(nList);
    nList=nListSave;
    prtList(nList,clo,row);
    return 0;
}

int **zz(int **nList,int row,int clo)
{
    int *nSave=NULL,**listSave=NULL,**listp=nList,*p=NULL,i,j;
    nSave=(int *)malloc(sizeof(int)*row*clo);
    listSave=(int **)malloc(sizeof(int*)*clo);//倒置后的矩阵
    p=nSave;

    for(j=0;j<clo;j++)
    {
        for(i=0;i<row;i++)
        {
            *p++=*listp[i];
            listp[i]=listp[i]+1;
        }
    }
    for(i=0;i<clo;i++)
        listSave[i]=&nSave[i*row];

    for(i=0;i<row;i++)
        free(nList[i]);//释放原矩阵行空间
    return  listSave;
}
void prtList(int **nList,int row,int clo)
{
    int i,j;
    for(i=0;i<row;i++)
    {
        for(j=0;j<clo;j++)
            printf("%d ",nList[i][j]);
        printf("\n");
    }
}
void setNum(int **nList,int n)
{
    int *p=nList[0];
    printf("填写矩阵中%d个数值:\n",n);
    while(n-->0)
        scanf("%d",p++);
}
int **getList(int row,int clo)
{
    int *nums,**nList,i;
    nums=(int *)malloc(sizeof(int)*row*clo);
    nList=(int **)malloc(sizeof(int*)*row);
    for(i=0;i<row;i++)
        nList[i]=&nums[i*clo];
    return nList;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-10-14

这是我以前写的,你修改一下#define N 4这个语句就可以用了

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 4
void main()
{
int i,j;
int a[3*N],b[N][3];//这里我设置旋转为4*4的矩形,自己在这里改成其它的矩形
int *p=a;//用指针来指向这个一维数组。这样在旋转赋值的时候会轻松很多
srand(time(NULL));
for(i=0;i<N*3;i++)
{
a[i]=rand()%100;//随机生成0~99
printf("%d\t",a[i]);
if((i+1)%4==0)
printf("\n");
}

for(i=N-2;i>=0;i--) //旋转
for(j=0;j<N;j++,p++)
b[j][i]=*p;



printf("顺时针旋转90度后:\n");
for(i=0;i<N;i++) //
{for(j=0;j<N-1;j++)
printf("%d\t",b[i][j]);
printf("\n");
}


}

本回答被网友采纳
相似回答