简单移动
例:设数据集合Data中有若干个整型数据:
Data = {10, 20, 30, 40, 50, 60, 70};
要求:讲第一个数据元素移至顺序表的最后
过程:
- x = a[0]
- 0 ~~ n - 2
- a[j] = a[j+1]
- a[j] = x
代码
- C代码
#include <stdio.h>
#define N 10
int main(void)
{
int a[N];
int i, temp;
for(i = 0; i < N; i ++)
scanf("%d", &a[i]);
temp = a[0];
for(i = 0; i < N-1; i ++)
a[i] = a[i+1];
a[i] = temp;
for(i = 0; i < N;i ++)
printf("%5d", a[i]);
return 0;
}
- 调用函数
#include <stdio.h>
#define N 10
void MoveElement(int a[])
{
int temp, i;
temp = a[0];
for(i = 0; i < N-1; i ++)
a[i] = a[i+1];
a[i] = temp;
}
int main(void)
{
int a[N];
int i;
for(i = 0; i < N; i ++)
scanf("%d", &a[i]);
MoveElement(a);
for(i = 0; i < N;i ++)
printf("%5d", a[i]);
return 0;
}
- 简单修改
#include <stdio.h>
#define N 10
void MoveElement(int a[])
{
int temp, i;
temp = a[0];
for(i = 0; i < N-1; a[i] = a[i+1], i ++);
a[i] = temp;
}
int main(void)
{
int a[N];
int i;
for(i = 0; i < N; i ++)
scanf("%d", &a[i]);
MoveElement(a);
for(i = 0; i < N;i ++)
printf("%5d", a[i]);
return 0;
}
交换式移动
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
元素 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 |
交换 | 20 | 10 | ||||||
交换 | 20 | 30 | 10 | |||||
交换 | — |
算法
#include <stdio.h>
#define N 10
void MoveElement(int a[])
{
int temp, i;
for(i = 0; i < N-1; i ++)
{
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
int main(void)
{
int a[N];
int i;
for(i = 0; i < N; i ++)
scanf("%d", &a[i]);
MoveElement(a);
for(i = 0; i < N;i ++)
printf("%5d", a[i]);
return 0;
}
例题
例题一:
设数据集合 Data = {10, 20, 30, 40, 50, 60, 70}
要求:将数据集合所有元素逆置
代码
- 第一种
#include <stdio.h>
#define N 10
void MoveElement(int a[])
{
int i, temp;
for(i = 0; i < (N-1)/2; i ++) // 奇偶两种情况都可以
{
temp = a[i];
a[i] = a[N-1-i];
a[N-i-1] = temp;
}
}
int main(void)
{
int a[N];
int i;
for(i = 0; i < N; i ++)
scanf("%d", &a[i]);
MoveElement(a);
for(i = 0; i < N;i ++)
printf("%5d", a[i]);
return 0;
}
- 第二种
#include <stdio.h>
#define N 10
void MoveElement(int a[])
{
int i, j, temp;
for(i = 0, j = N-1; i != j && i<j; i ++, j --)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
int main(void)
{
int a[N];
int i;
for(i = 0; i < N; i ++)
scanf("%d", &a[i]);
MoveElement(a);
for(i = 0; i < N;i ++)
printf("%5d", a[i]);
return 0;
}
#include <stdio.h>
#define N 10
void MoveElement(int a[])
{
int i, j, temp;
for(i = 0, j = N-1; i < N/2; i ++, j --)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
int main(void)
{
int a[N];
int i;
for(i = 0; i < N; i ++)
scanf("%d", &a[i]);
MoveElement(a);
for(i = 0; i < N;i ++)
printf("%5d", a[i]);
return 0;
}
#include <stdio.h>
#define N 10
void MoveElement(int a[])
{
int i, j, temp;
for(i = 0, j = N-1; i < j; i ++, j --)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
int main(void)
{
int a[N];
int i;
for(i = 0; i < N; i ++)
scanf("%d", &a[i]);
MoveElement(a);
for(i = 0; i < N;i ++)
printf("%5d", a[i]);
return 0;
}
例题二
设有数据集合 Data = {10, 20, 30, 40, 50, 60, 70};
要求:将数组的前 m 个元素和数组的后 k个元素交换
#include <stdio.h>
#define N 10
void MovePartElement(int a[], int m)
{
int i, j, temp;
while(m --)
{
temp = a[0];
for(i = 0; i < N-1; a[i] = a[i+1], i ++);
a[i] = temp;
}
}
int main(void)
{
int a[N];
int i, m;
for(i = 0; i < N; i ++)
scanf("%d", &a[i]);
scanf("%d", &m);
MovePartElement(a, m);
for(i = 0; i < N;i ++)
printf("%5d", a[i]);
return 0;
}
- 方法二:逆置
#include <stdio.h>
#define N 10
void MovePartElement(int a[], int num1, int num2)
{
int i, j, temp;
for(i = num1, j = num2-1; i < j; i ++, j--)
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
int main(void)
{
int a[N];
int i, m, k;
for(i = 0; i < N; i ++)
scanf("%d", &a[i]);
scanf("%d%d", &m, &k); // 前 m 个 后 k 个
MovePartElement(a, 0, N);
MovePartElement(a, 0, k);
MovePartElement(a, N-m, N);
for(i = 0; i < N;i ++)
printf("%5d", a[i]);
return 0;
}