概述
题目:
有序数组中加入一个新的数据,需保持数组有序,如何操作?
方式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 %dn", 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
转载于:https://www.cnblogs.com/xfiver/p/3040172.html
最后
以上就是愤怒紫菜为你收集整理的数组内数据不使用for循环实现多个移动的全部内容,希望文章能够帮你解决数组内数据不使用for循环实现多个移动所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复