C使用指针,一个已排好序的数组中,插入一个数,按照原来顺序,第一次正确,但循环之后,不对,高手进。

来源:百度知道 编辑:UC知道 时间:2024/05/31 10:06:10
#include <stdio.h>
#define N 11
void composior(int *p,int n,int num);

main()
{int a[N]={1,4,6,9,13,16,19,28,40,100};
int num,*pt,i;
clrscr();
for(i=0;i<=2;i++) { /*第一次循环之后,数组就改变了,但我不是我想的,请看下面,谢谢*/
printf("original array is:");
for(pt=a;pt<a+N-1;pt++)
printf("%5d",*pt);
printf("\n");
printf("the insert num is:");
scanf("%d",&num);
composior(a,N,num);
printf("\nNow array is:");
for(pt=a;pt<a+N;pt++)
printf("%5d",*pt);
printf("\n\n-----------------------------------------\n"); }

getch();return 0; }
void composior(int b[],int n,int num)
{int *q,*p=b;
if(num>*(p+n-2)) *(p+n-1)=num;
else {
for(;p<b+n-1;p++)
if(*p>num) {
for(q=b+n-2;q>=p;q--)
*(q+1)=*q;
*p=num;break;
}} }
第一次循环之

我来答第二个问题 呵呵~
break语句的作用是退出最近的一层循环或者是switch结构
如果去除break;就是
int *q,*p=b;
if(num>*(p+n-2)) *(p+n-1)=num;/*如果输入的数大于倒数第二个数 那么就将最后一个数赋值为此数 */
else {
for(;p<b+n-1;p++) //A
if(*p>num) {
for(q=b+n-2;q>=p;q--)
*(q+1)=*q;
*p=num;//B
}}
以插入数8为例
B语句结束后,p,q两个指针都指向了插入的数字num,这时8后移到原来9的位置
排序也已经达到了预期的效果,但请看A语句 这还远远没有结束!
p又会后移指向8,8又被后移覆盖下个数据……结果就是146后有很多个8和一个9
其他数据也在后面只是没有访问到。
加上break后B语句结束后就能跳出A,不会出现以上状况。

#include <stdio.h>
#define N 11
void composior(int *p,int n,int num);

main()
{
int num,*pt,i;
clrscr();
for(i=0;i<=2;i++) { /*第一次循环之后,数组就改变了,但我不是我想的,请看下面,谢谢*/
int a[N]={1,4,6,9,13,16,19,28,40,100};《====数组定义在这里就可以了
printf("original array is:");
for(pt=a;pt<a+N-1;pt++)
printf("%5d",*pt);
printf("\n");
printf("the insert num i