zoukankan      html  css  js  c++  java
  • 数组内数据不使用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("
    ");
    
    }
    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
    ", 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

  • 相关阅读:
    6、方法
    5、封装
    4、循环
    3、判断
    2、基本语法
    1、基本框架
    CodeForces 681C Heap Operations(模拟)
    CodeForces 682C Alyona and the Tree(广搜 + 技巧)
    URAL 2099 Space Invader题解 (计算几何)
    HDU 5833 (2016大学生网络预选赛) Zhu and 772002(高斯消元求齐次方程的秩)
  • 原文地址:https://www.cnblogs.com/xfiver/p/3040172.html
Copyright © 2011-2022 走看看