7-5 数组循环左移

作者 DS课程组

单位 浙江大学

本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a0​a1​⋯an−1​)变换为(am​⋯an−1​a0​a1​⋯am−1​)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

输入第1行给出正整数n(≤100)和整数m(≥0);第2行给出n个整数,其间以空格分隔。

输出格式:

在一行中输出循环左移m位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:

8 3
1 2 3 4 5 6 7 8

输出样例:

4 5 6 7 8 1 2 3

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

 leftreverse 函数的使用思路:

  1. 保存要移动的元素:将数组的前 m 个元素保存到一个临时数组中。
  2. 左移剩余元素:将数组中的剩余元素(从第 m 个元素开始)向左移动 m 个位置。这可以通过将每个元素复制到它前面 m 个位置的位置来实现。
  3. 将保存的元素放回数组:将临时数组中的元素放回原数组的末尾。

main 函数按照以下步骤执行:

  1. 初始化顺序表。
  2. 输入顺序表的最大容量和要左移的位数。
  3. 循环输入顺序表的元素。
  4. 对顺序表进行循环左移。
  5. 显示循环左移后的顺序表内容。
  6. 销毁顺序表并释放内存。

C程序如下:

#include<stdio.h>  
#include<stdlib.h>  
  
// 定义ElemType为int类型,用于表示顺序表中的元素类型  
typedef int ElemType;  
  
// 定义顺序表的结构体  
typedef struct _SeqList {  
	ElemType* Data;    // 指向数组元素的指针  
	int length;        // 当前顺序表的长度  
	int size;          // 顺序表的最大容量  
} SeqList;  
  
// 初始化顺序表  
void InitList(SeqList* List, int n) {  
	List->Data = (ElemType*)malloc(n * sizeof(ElemType)); // 为顺序表分配内存  
	if (List->Data == NULL) {  
		printf("Memory allocation failed"); // 如果内存分配失败,打印错误信息  
		exit(EXIT_FAILURE); // 退出程序  
	}  
	List->length = 0; // 初始化顺序表长度为0  
	List->size = n;   // 设置顺序表的最大容量为n  
}  
  
// 销毁顺序表,释放内存  
void DestroyList(SeqList* List) {  
	free(List->Data); // 释放顺序表占用的内存  
}  
  
// 向顺序表添加元素  
void AppendList(SeqList* List, int Elem) {  
	List->Data[List->length] = Elem; // 将元素放入顺序表的当前末尾位置  
	List->length++; // 顺序表长度加1  
}  
  
// 显示顺序表的内容  
void DispList(SeqList* List) {  
    printf("%d", List->Data[0]); // 打印第一个元素  
	for (int i = 1; i < List->length; i++) {  
		printf(" %d", List->Data[i]); // 打印后续的元素,并在每个元素前加上空格  
	}  
}  
  
// 循环左移顺序表的函数(但当前实现有误)  
void leftreverse(SeqList *list, int m) {  
    for (int i = 0; i < m; i++) {  
        int empt = list->Data[0]; // 取出第一个元素  
        for (int j = 0; j < list->length - 1; j++) {  
            list->Data[j] = list->Data[j + 1]; // 将后续元素前移  
        }  
        list->Data[list->length - 1] = empt; // 将取出的第一个元素放到末尾  
    }  
}  
  
int main() {  
	ElemType number; // 用于临时存储输入的元素  
	SeqList Nums;    // 定义顺序表变量  
	int n;           // 用于存储顺序表的最大容量  
	scanf("%d", &n); // 从输入读取顺序表的最大容量  
	InitList(&Nums, n); // 初始化顺序表  
	int move;         // 用于存储需要循环左移的位数  
	scanf("%d", &move); // 从输入读取需要循环左移的位数  
	for (int i = 0; i < n; i++) {  
		scanf("%d", &number); // 从输入读取元素  
		AppendList(&Nums, number); // 将元素添加到顺序表中  
	}  
    leftreverse(&Nums, move); // 对顺序表进行循环左移  
	DispList(&Nums);         // 显示循环左移后的顺序表内容  
	DestroyList(&Nums);      // 销毁顺序表,释放内存  
	return 0;  
}

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值