数组内数据不使用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

posted @ 2013-12-13 11:26  .小武.  阅读(1493)  评论(0编辑  收藏  举报