C 语言 关于指针和数组问题。

puhjack 2009-03-21 04:40:10
有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数 这是题目,以下是我写的代码。
个人认为思维上此代码可以通过,但是编译后得到的结果却是不符合我的要求。麻烦各位指点谢谢

题目的要求是用指针做题,请朋友们不要给出数组的做法。

#include <stdio.h>
#include <stdlib.h>

#define MAX 10

int main( void )
{
int *p;
int temp, temp_s; // temp temp_s 均是暂存作用
int i, m, n; // i -> count , m移位的位数
int arr[MAX] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

printf( "输入移动的位数:\n" );
//scanf( "%d", &m );
m = 3; // 调试期间为了速度所以直接给出值。

printf( "Enter 10 number, and build source array:\n" );
/* for( i = 0; i < MAX; i++ )
{
scanf( "%d", &arr[i] );
} */ // 同上

p = &arr[0];

for( n = 0; n < m; n++ )
{
for( i = 0; i < MAX - m; i++ )
{
temp = *(p+i+1); // 把下一个数的值先暂存
*(p+i+1) = *(p+i); // 然后再赋值

temp_s = *(p+i+2); // 把第二个数再暂存
*(p+i+2) = temp; // 然后复制
}
}

printf( "Compare you enter number's sort.\n" );
for( i = 0; i < MAX; i++ )
{
printf( "arr[%d] = %d\n", i, arr[i] );
}

system( "pause" );
return 0;
}
...全文
53 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
puhjack 2009-03-21
  • 打赏
  • 举报
回复
感谢大家
h13826013646 2009-03-21
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

#define MAX 20 //MAX是用来申请空间大小的,要确保大于m+n才能保证数据不溢出

int main( void )
{
int *p;
int i,m, n,arr[MAX]={0}; //n是数组中要移动的数的个数
printf( "输入移动的数据的个数:\n" );
scanf( "%d", &n);
printf( "输入移动的位数:\n" );
scanf( "%d", &m ); //m是要移动的位数
printf( "Enter number, and build source array:\n" );
for(i = 0; i < n; i++ ) //输入n个要移动的数
{
scanf( "%d", &arr[i] );
}
p = &arr[n]; //p附给要移动的数的最有一个数的地址
for( i =n; i >=0 ; i-- )
{
*(p+m) = *p;//把数向后移动m位,从最后一个数开始知道所有的数
p--;
}
printf( "Compare you enter number's sort.\n" );
for( i = 0; i < MAX; i++ )
{
printf( "arr[%d] = %d\n", i, arr[i] );
}
system( "pause" );
return 0;
}
traceless 2009-03-21
  • 打赏
  • 举报
回复
for (n=0;n<m;i++)
{
temp_s = *(p+9-n); //先保存每轮的最后的那个数
for (i=9;i>0;i--)
*(p+i) = *(p+i-1); //轮换

*(p+n)=temp_s;
}



把你的循环体改成这样就好了

关键在于保存最后一个数
  • 打赏
  • 举报
回复


int main( void )
{
int *p;
int temp, temp_s; // temp temp_s 均是暂存作用
int i, m, n; // i -> count , m移位的位数
int arr[MAX] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9},copy[MAX];

printf( "输入移动的位数:\n" );
//scanf( "%d", &m );
m = 3; // 调试期间为了速度所以直接给出值。

printf( "Enter 10 number, and build source array:\n" );
/* for( i = 0; i < MAX; i++ )
{
scanf( "%d", &arr[i] );
} */ // 同上

p = &arr[0];

for(i=0;i<MAX;i++)            //用额外的数组接收就是了,不要搞得那么复杂,控件可以帮你节省时间
{
if(i<MAX-m)
copy[i+m]=arr[i];
else
copy[i+m-MAX]= arr[i];
}
for(i=0;i<MAX;i++)
arr[i]=copy[i];

printf( "Compare you enter number's sort.\n" );
for( i = 0; i < MAX; i++ )
{
printf( "arr[%d] = %d\n", i, arr[i] );
}

system( "pause" );
return 0;
}

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧