C语言实现数组或字符串倒序排列方法及代码示例
编辑:本站更新:2024-12-14 00:24:42人气:6085
在C编程中,对数组或者字符串进行逆序排序是一项基础且实用的操作。通过精心设计的算法和循环结构可以有效地实现在内存中的原地翻转操作,无需额外的数据存储空间。下面将详细介绍几种针对字符数组(即字符串)以及数值型数据数组进行倒序排列的方法,并配以相应的C语言源码实例。
**一、使用指针交换元素法——适用于整数数组**
假设我们有一个包含n个int类型元素的一维数组arr:
#include <stdio.h>
void reverseArray(int arr[], int n) {
if (n <= 1)
return;
// 创建两个指向当前首尾元素的指针
int *start = &arr[0];
int *end = &arr[n - 1];
while(start < end){
// 使用临时变量完成两端值互换
int temp = *start;
*start++ = *end;
*end-- = temp;
}
}
int main() {
int array[] = {1,2,3,4,5};
int size = sizeof(array)/sizeof(array[0]);
printf("Original Array: ");
for(int i=0;i<size;++i)
printf("%d ",array[i]);
reverseArray(array,size);
printf("\nReversed Array: ");
for(int j=size-1;j>=0;--j)
printf("%d ",array[j]);
return 0;
}
上述程序首先定义了一个函数`reverseArray()`来反转一个给定大小的整数数组。该函数利用了两根指针分别从头与尾开始遍历并逐次交换位置的方式实现了整个数组的逆转过程。
**二、库函数strrev已过时但概念适用——仅用于字符串**
虽然标准C库没有提供直接对字符串进行倒序的函数(注:早期ANSI C有非标准的 `strrev()` 函数),但是我们可以模仿其原理自行编写类似功能的函数:
char* strReverse(char input[]) {
char *front = input;
char *back = strchr(input, '\0') - 1;
/* Swap characters from both ends */
while(front < back) {
char tmp = *front;
*front++ = *back;
*back-- = tmp;
}
return input;
}
int main(void) {
char string []="Hello World!";
puts(strReverse(string));
return 0;
}
在此代码段里,我们将输入字符串视为字符数组处理,找到它的末尾并通过递减索引移动到起始处,在此过程中不断执行前后端字符置换直至两者相遇为止。
**三、采用双层循环法 —— 通用性较高可应用于任意类型的数组**
对于更复杂的情况比如多维数组或者其他自定义对象数组等场景下,可能需要运用更为普遍性的双重for循环策略来进行顺序颠倒:
#define SIZE 5
typedef struct{
int data;
}somedata_t;
void reverseAnyDimensional(somedata_t arr[][SIZE]) {
somedata_t copy[SIZE][SIZE]={{0}}; // 做备份用的空间
// 将原始二维数组按行存入copy数组的最后一列至上一列
for(int row = 0; row<SIZE ; ++row )
for(int col = SIZE-1;col >= 0; --col )
copy[row][(SIZE-1)-col]=arr[row][col];
// 再把复制后的内容回填至原始数组从而达到矩阵旋转的效果
for(int r = 0;r< SIZE;r++)
for(int c = 0;c< SIZE;c++)
arr[r][c] = copy[r][c];
}
...
int main(){
somedata_t my_array[SIZE][SIZE]={...}; // 初始化你的多维度数组
reverseAnyDimensional(my_array);
...
return 0;
}
这段代码展示了如何在一个抽象层面去反向填充一个多维度数组。当然实际应用可以根据具体需求调整内部逻辑以适应不同形态的数据容器及其内容。
总结起来,无论是在简单的单维度整数数组还是复杂的多维度甚至字符序列上实施倒排操作,核心思想都是借助于指针或索引来定位待转换的位置并在合适时机进行元素替换。掌握这些基本技巧有助于开发者解决各类涉及数据重新组织的问题,提升编码效率的同时也深化了对C语言底层特性和机制的理解。
**一、使用指针交换元素法——适用于整数数组**
假设我们有一个包含n个int类型元素的一维数组arr:
c
#include <stdio.h>
void reverseArray(int arr[], int n) {
if (n <= 1)
return;
// 创建两个指向当前首尾元素的指针
int *start = &arr[0];
int *end = &arr[n - 1];
while(start < end){
// 使用临时变量完成两端值互换
int temp = *start;
*start++ = *end;
*end-- = temp;
}
}
int main() {
int array[] = {1,2,3,4,5};
int size = sizeof(array)/sizeof(array[0]);
printf("Original Array: ");
for(int i=0;i<size;++i)
printf("%d ",array[i]);
reverseArray(array,size);
printf("\nReversed Array: ");
for(int j=size-1;j>=0;--j)
printf("%d ",array[j]);
return 0;
}
上述程序首先定义了一个函数`reverseArray()`来反转一个给定大小的整数数组。该函数利用了两根指针分别从头与尾开始遍历并逐次交换位置的方式实现了整个数组的逆转过程。
**二、库函数strrev已过时但概念适用——仅用于字符串**
虽然标准C库没有提供直接对字符串进行倒序的函数(注:早期ANSI C有非标准的 `strrev()` 函数),但是我们可以模仿其原理自行编写类似功能的函数:
c
char* strReverse(char input[]) {
char *front = input;
char *back = strchr(input, '\0') - 1;
/* Swap characters from both ends */
while(front < back) {
char tmp = *front;
*front++ = *back;
*back-- = tmp;
}
return input;
}
int main(void) {
char string []="Hello World!";
puts(strReverse(string));
return 0;
}
在此代码段里,我们将输入字符串视为字符数组处理,找到它的末尾并通过递减索引移动到起始处,在此过程中不断执行前后端字符置换直至两者相遇为止。
**三、采用双层循环法 —— 通用性较高可应用于任意类型的数组**
对于更复杂的情况比如多维数组或者其他自定义对象数组等场景下,可能需要运用更为普遍性的双重for循环策略来进行顺序颠倒:
c
#define SIZE 5
typedef struct{
int data;
}somedata_t;
void reverseAnyDimensional(somedata_t arr[][SIZE]) {
somedata_t copy[SIZE][SIZE]={{0}}; // 做备份用的空间
// 将原始二维数组按行存入copy数组的最后一列至上一列
for(int row = 0; row<SIZE ; ++row )
for(int col = SIZE-1;col >= 0; --col )
copy[row][(SIZE-1)-col]=arr[row][col];
// 再把复制后的内容回填至原始数组从而达到矩阵旋转的效果
for(int r = 0;r< SIZE;r++)
for(int c = 0;c< SIZE;c++)
arr[r][c] = copy[r][c];
}
...
int main(){
somedata_t my_array[SIZE][SIZE]={...}; // 初始化你的多维度数组
reverseAnyDimensional(my_array);
...
return 0;
}
这段代码展示了如何在一个抽象层面去反向填充一个多维度数组。当然实际应用可以根据具体需求调整内部逻辑以适应不同形态的数据容器及其内容。
总结起来,无论是在简单的单维度整数数组还是复杂的多维度甚至字符序列上实施倒排操作,核心思想都是借助于指针或索引来定位待转换的位置并在合适时机进行元素替换。掌握这些基本技巧有助于开发者解决各类涉及数据重新组织的问题,提升编码效率的同时也深化了对C语言底层特性和机制的理解。
www.php580.com PHP工作室 - 全面的PHP教程、实例、框架与实战资源
PHP学习网是专注于PHP技术学习的一站式在线平台,提供丰富全面的PHP教程、深入浅出的实例解析、主流PHP框架详解及实战应用,并涵盖PHP面试指南、最新资讯和活跃的PHP开发者社区。无论您是初学者还是进阶者,这里都有助于提升您的PHP编程技能。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。