我们在考虑数据前后交换的问题时,若middle指针的位置小于中位数,即后方移动的数据多于前方,故需要将前方数据先进行备份,再将后方数据移动至front指针位置,最后将先前备份的数据拷贝回剩余的数据结构中。
这是一种通用的解决方案。着重理解rotate1方法。注意内存位置的移动和计算(核心思想)。memmove方法与memcpy方法相似,不同的是,目标和源 有重叠时,其能够正常工作。
#include <iostream>
#include <string.h>
using namespace std;
void rotate1(void *front, void *middle, void *end) {
int front_size = (char *)middle - (char *)front;
int back_size = (char *)end - (char *)middle;
// char buffer[front_size];
char *buffer = (char *) malloc(front_size);
memcpy(buffer, front, front_size);
memmove(front, middle, back_size);
memcpy((char *)end - front_size, buffer, front_size);
//also like follow
//memcpy((char *)front + ((char *)end - (char *)middle), temp, (char *)middle - (char *)front);
free(buffer);
}
void rotate2(void *front, void *middle, void *end) {
char *temp = (char *) malloc((char *)middle - (char *)front);
memcpy(temp, front, (char *)middle - (char *)front);
memmove(front, middle, (char *)end - (char *)middle);
memcpy((char *)front + ((char *)end - (char *)middle), temp, (char *)middle - (char *)front);
free(temp);
}
int main() {
int a[7] = {1, 2, 3, 4, 5, 6, 7};
rotate1(&a[0], &a[2], &a[6]);
int i=0;
for(; i < 7; i++) {
cout << a[i] << endl;
}
getchar();
return 0;
}
本文详细介绍了在数据结构中进行前后交换操作时的一种通用解决方案。通过使用rotate1和rotate2方法,确保了内存位置的正确移动和计算,特别强调了memmove与memcpy的区别及其在重叠内存区域的操作能力。通过实例演示了如何在数组中实现数据的灵活移动,为开发者提供了实用的编程技巧。
2万+

被折叠的 条评论
为什么被折叠?



