C语言编写函数,实现将数组中连续的若干个元素的翻转。
时间: 2024-03-08 13:45:30 浏览: 116
好的,下面是一个用C语言实现将数组中连续的若干个元素翻转的函数:
```c
void reverse_sublist(int arr[], int start, int end) {
while (start < end) {
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
```
其中,`arr`是待操作的数组,`start`和`end`分别表示需要翻转的子数组的起始位置和结束位置(包含在内)。
具体实现步骤为:从子数组的两端开始,依次交换元素,直到两端相遇。
例如,对于数组`{1, 2, 3, 4, 5, 6, 7}`,如果需要翻转从下标2(即元素3)到下标4(即元素5)的子数组,可以调用函数`reverse_sublist(arr, 2, 4)`,得到翻转后的数组`{1, 2, 5, 4, 3, 6, 7}`。
注意,该函数并未对输入进行边界检查,使用时需要保证`start`和`end`的值合法,并且数组中元素的类型应该与函数参数`int`一致。
相关问题
用C语言编写以下程序给定一个字符串,翻转该字符串,翻转时单词中的字符顺序不变。例如,如果字符串为"Hello World",则翻转后为"World Hello"。单词间以一个或多个空格分隔。注意,字符串开头和结尾都可能有多个空格。输出时去掉多余的空格。只在每个单词之间以1个空格间隔。输出的每行末尾没有空格。 输入格式: 输入可能包括多行。每行代表一个字符串,除了空格外,标点符号和普通字母一样处理。你可以认为一行的字符总数不会超过50000个,单词数不会超过600,每个单词的长度也不会超过30。 输出格式: 输出包括多行,每行对应输入的一行,为翻转后的字符串。输出时去掉多余的空格。只在每个单词之前以1个空格间隔。输出的每行末尾没有空格。 输入样例: 在这里给出一组输入。例如: student. a am I World Hello 输出样例: 在这里给出相应的输出。例如: I am a student. Hello World
以下是C语言的实现代码:
```c
#include <stdio.h>
#include <string.h>
#define MAXN 50010
#define MAXM 610
char s[MAXN];
char words[MAXM][30]; // 存储每个单词
int len[MAXM]; // 存储每个单词的长度
int main()
{
while (fgets(s, MAXN, stdin)) {
int n = strlen(s);
if (s[n-1] == '\n') s[n-1] = '\0'; // 去掉换行符
int cnt = 0; // 记录单词个数
n = strlen(s);
for (int i = 0, j = 0; i < n; i++) {
if (s[i] == ' ') {
if (j) cnt++; // j 不为 0 表示 j 到 i-1 是一个单词
j = 0;
} else {
words[cnt][j++] = s[i];
}
}
if (j) cnt++; // 处理最后一个单词
for (int i = 0; i < cnt/2; i++) { // 翻转单词
char temp[30];
strcpy(temp, words[i]);
strcpy(words[i], words[cnt-i-1]);
strcpy(words[cnt-i-1], temp);
}
for (int i = 0; i < cnt; i++) len[i] = strlen(words[i]); // 记录每个单词的长度
int p = 0;
for (int i = 0; i < cnt; i++) { // 输出结果
printf("%s", words[i]);
p += len[i];
while (p < n && s[p] == ' ') p++;
if (p < n) printf(" ");
p++;
}
printf("\n");
}
return 0;
}
```
该程序通过 `fgets()` 函数读入多行字符串,然后对于每行字符串进行处理。
对于每行字符串,我们首先将其分割成若干个单词,并存储在 `words` 数组中。为了方便处理,我们记录每个单词的长度,存储在 `len` 数组中。我们使用 `cnt` 变量记录单词的个数。
然后,我们翻转 `words` 数组中的单词,即将 `words[0]` 和 `words[cnt-1]` 交换,`words[1]` 和 `words[cnt-2]` 交换,以此类推。
最后,我们输出翻转后的结果。对于每个单词,我们首先输出它本身,然后检查原始字符串中单词后面的空格。如果有多个空格,我们只输出一个空格。输出结束后,我们记得换行。
需要注意的是,我们使用 `fgets()` 函数读入字符串,该函数会将换行符也读入,因此我们需要将字符串中的换行符去掉。
该程序的时间复杂度为 $O(Tn)$,其中 $T$ 是字符串的行数,$n$ 是字符串的总长度。
阅读全文