数组内数据不使用for循环实现多个移动

题目:

有序数组中加入一个新的数据,需保持数组有序,如何操作?

方式A :for循环将后续数组依次后移。

方式B :内存拷贝

代码:

/*****************************************************************************

**    Name:20130424-arrayCopy.c

**    有序数组内插入新的数据,而后续数据向后移动,传统作为for操作,改进方式使用内存拷贝

**    Author:Fivezh

**    Date:20130424

**    Copyright (c) 2013,All Rights Reserved!

*****************************************************************************/

#include <stdio.h>

#include <string.h>



void showArrary(int *pArray, int count)

{

    int i;

    for (i = 0; i < count; ++i)

    {

        printf("%d ", *(pArray +i));

    }

    printf("\n");



}

int main(int argc, char const *argv[])

{

    int arrayList[10]={1,2,3,4,6,7};//原始6个数据

    //现需要插入数据5,且保持有序

    int insertData = 5;

    int *pInsertPoint = NULL;

    int i;

    showArrary(arrayList,10);

    for (i = 0; i < sizeof(arrayList); ++i)

    {

        // printf("%d ", arrayList[i]);

        if (arrayList[i] <= insertData)

        {

            continue;

        }

        else

        {

            pInsertPoint = &arrayList[i];

            printf("insert before %d\n", arrayList[i]);

            break;

        }

    }



    if (pInsertPoint != NULL)

    {

        int *p = NULL;

        

        p = memmove(pInsertPoint+1,pInsertPoint,2*sizeof(int));

        

        // p = memcpy(pInsertPoint+1,pInsertPoint,2*sizeof(int));

        //当拷贝区域存在重叠区域时,memcpy()函数会导致覆盖和cpy错误问题;而memmove()可有效避免

        *pInsertPoint = insertData;



    }

    showArrary(arrayList,10);



    return 0;

}

 

总结:

对数组的操作,潜意识里只有循环操作,多理解c/c++的指针,会有额外收获。

1. 指针+1,到底移动了多少个字节,是由指针类型决定的,如

int *p=0x1234;p=p+1;

则此时p=0x1238

char *p=0x1234;p=p+1;

则此时p=0x1235

2. 数组名+1,到底移动了多少字节,

int a[10];

则a+1或&a[0]+1或(int *)&a+1或(int *)((char *)&a+sizeof(int))均可表示a[1]的地址,即&a[1]

参考1:腾讯2013年实习生笔试题目(附答案)http://www.cnblogs.com/xiaoxuetu/archive/2013/04/20/3032811.html

参考2:memcpy与memmove区别与实现 http://www.cnblogs.com/kekec/archive/2011/07/22/2114107.html

你可能感兴趣的:(for循环)