我们在考虑数据前后交换的问题时,若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; }