第18行的while循环中,j--,j小于0后仍然会继续执行,因为你的while条件只有j<n-1,死循环了,应该在while条件中加上 j>=0
while中的条件,把j>=0 && j<n-1 放在前面,否则可能会导致数组越界。
22行的i同样的问题。
下面的代码是之前写过的一个,供参考:
#include <stdio.h>
#include <stdlib.h>
//螺旋数
void luoxuanshu(int n,int start,int** p,int indexx = 0,int indexy = 0)
{
int i,j;
if(n==0)
return;
else if(n == 1)
p[indexx][indexy] = start;
else
{
//上一层
for(i=0;i<n;i++)
{
p[indexx][indexy+i] = start;
start++;
}
//右边
for (i=1;i<n;i++)
{
p[indexx+i][indexy+n-1] = start;
start++;
}
//底边
for (i=n-2;i>=0;i--)
{
p[indexx+n-1][indexx+i] = start;
start++;
}
//左边
for (i = n-2;i>=1;i--)
{
p[indexx+i][indexy] = start;
start++;
}
indexx++;
indexy++;
luoxuanshu(n-2,start,p,indexx,indexy);
}
}
//矩阵旋转,向右侧旋转90°
void rotate(int n,int** p)
{
int i,j;
int t,index=0;
//向左旋转90°
for (i=0;i<n;i++)
{
for (j=i;j<n;j++)
{
t = p[j][index];
p[j][index] = p[index][j];
p[index][j]=t;
}
index++;
}
//左右列互换
for(i=0;i<n/2;i++)
{
for(j=0;j<n;j++)
{
t=p[j][i];
p[j][i] = p[j][n-1-i];
p[j][n-1-i] = t;
}
}
}
int main()
{
int n,i,j;
int**p;
scanf("%d",&n);
p = (int**)malloc(sizeof(int*)*n);
for(i=0;i<n;i++)
{
p[i] = (int*)malloc(sizeof(int)*n);
for(j=0;j<n;j++)
p[i][j] = 0;
}
luoxuanshu(n,1,p);
for (i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%2d\t",p[i][j]);
printf("\n");
}
printf("旋转后:\n");
rotate(n,p);
for (i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%2d\t",p[i][j]);
printf("\n");
}
free(p);
p=0;
return 0;
}
18行应该是j>0,22行是i>0,这两行是要进行i--和j--,你应该判断i和j大于0 啊
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!