数组是C语言中一种非常重要的数据结构,它允许我们以连续的内存空间存储多个数据项。在编程实践中,熟练掌握数组的运用对于编写高效、可靠的代码至关重要。本文将深入探讨C语言数组的30个经典例题,帮助读者轻松掌握数组编程技巧。
例题1:数组的声明和初始化
int numbers[5] = {1, 2, 3, 4, 5};
在这个例子中,我们声明了一个包含5个整数的数组,并初始化了它的所有元素。
例题2:数组的遍历
for (int i = 0; i < 5; i++) {
printf("%d ", numbers[i]);
}
这里我们使用for循环遍历数组,并打印出每个元素的值。
例题3:数组的排序
void sortArray(int arr[], int n) {
int i, j, temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
这是一个简单的冒泡排序算法,用于对数组进行排序。
例题4:数组中的查找
int findElement(int arr[], int n, int element) {
for (int i = 0; i < n; i++) {
if (arr[i] == element) {
return i;
}
}
return -1;
}
这个函数用于在数组中查找指定元素的位置。
例题5:二维数组的声明和初始化
int matrix[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
这是一个3x3的二维数组声明和初始化的例子。
例题6:二维数组的遍历
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
这个例子演示了如何遍历二维数组并打印其元素。
例题7:二维数组的逆序打印
void reversePrint(int arr[][3], int rows, int cols) {
for (int i = rows - 1; i >= 0; i--) {
for (int j = cols - 1; j >= 0; j--) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
这个函数用于逆序打印二维数组。
例题8:字符串数组的使用
char *strings[] = {"Hello", "World", "C Language"};
这里我们声明了一个字符串数组,并初始化了它。
例题9:字符串数组的遍历
for (int i = 0; strings[i] != NULL; i++) {
printf("%s\n", strings[i]);
}
这个例子演示了如何遍历字符串数组。
例题10:数组中的最大值和最小值
void findMaxMin(int arr[], int n, int *max, int *min) {
*max = arr[0];
*min = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > *max) {
*max = arr[i];
}
if (arr[i] < *min) {
*min = arr[i];
}
}
}
这个函数用于找到数组中的最大值和最小值。
例题11:数组的复制
void copyArray(int src[], int dest[], int n) {
for (int i = 0; i < n; i++) {
dest[i] = src[i];
}
}
这个函数用于将一个数组的元素复制到另一个数组中。
例题12:数组中的元素移除
void removeElement(int arr[], int *n, int element) {
int i, j;
for (i = 0; i < *n; i++) {
if (arr[i] == element) {
for (j = i; j < *n - 1; j++) {
arr[j] = arr[j + 1];
}
(*n)--;
}
}
}
这个函数用于从数组中移除指定元素。
例题13:数组的旋转
void rotateArray(int arr[], int n, int k) {
for (int i = 0; i < k; i++) {
int temp = arr[0];
for (int j = 0; j < n - 1; j++) {
arr[j] = arr[j + 1];
}
arr[n - 1] = temp;
}
}
这个函数用于将数组向右旋转k个位置。
例题14:数组中的连续序列
int longestConsecutive(int arr[], int n) {
int max = 0, current = 1;
for (int i = 1; i < n; i++) {
if (arr[i] == arr[i - 1] + 1) {
current++;
} else {
if (current > max) {
max = current;
}
current = 1;
}
}
return max > current ? max : current;
}
这个函数用于找到数组中最长的连续序列。
例题15:数组的逆序
void reverseArray(int arr[], int n) {
int temp;
for (int i = 0; i < n / 2; i++) {
temp = arr[i];
arr[i] = arr[n - i - 1];
arr[n - i - 1] = temp;
}
}
这个函数用于逆序一个数组。
例题16:数组的逆序查找
int reverseSearch(int arr[], int n, int element) {
for (int i = n - 1; i >= 0; i--) {
if (arr[i] == element) {
return i;
}
}
return -1;
}
这个函数用于逆序查找数组中的元素。
例题17:数组中的最大子数组和
int maxSubArraySum(int arr[], int n) {
int maxSoFar = arr[0], maxEndingHere = arr[0];
for (int i = 1; i < n; i++) {
maxEndingHere = (arr[i] > maxEndingHere + arr[i]) ? arr[i] : maxEndingHere + arr[i];
maxSoFar = (maxSoFar > maxEndingHere) ? maxSoFar : maxEndingHere;
}
return maxSoFar;
}
这个函数用于找到数组中的最大子数组和。
例题18:数组的合并
void mergeArrays(int arr1[], int n1, int arr2[], int n2, int result[]) {
int i = 0, j = 0, k = 0;
while (i < n1 && j < n2) {
if (arr1[i] < arr2[j]) {
result[k++] = arr1[i++];
} else {
result[k++] = arr2[j++];
}
}
while (i < n1) {
result[k++] = arr1[i++];
}
while (j < n2) {
result[k++] = arr2[j++];
}
}
这个函数用于合并两个数组。
例题19:数组的划分
void partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
}
这个函数用于将数组划分为两部分。
例题20:数组的旋转(使用索引调整)
void rotateUsingIndexAdjustment(int arr[], int n, int k) {
int *temp = (int *)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
temp[(i + k) % n] = arr[i];
}
for (int i = 0; i < n; i++) {
arr[i] = temp[i];
}
free(temp);
}
这个函数使用索引调整方法来旋转数组。
例题21:数组中的最大差值
int maxDifference(int arr[], int n) {
int maxDiff = arr[1] - arr[0];
for (int i = 1; i < n - 1; i++) {
if (arr[i + 1] - arr[i] > maxDiff) {
maxDiff = arr[i + 1] - arr[i];
}
}
return maxDiff;
}
这个函数用于找到数组中的最大差值。
例题22:数组中的最长公共前缀
char *longestCommonPrefix(char *str1, char *str2) {
int len1 = strlen(str1);
int len2 = strlen(str2);
int minLen = (len1 < len2) ? len1 : len2;
int commonLen = 0;
for (int i = 0; i < minLen; i++) {
if (str1[i] != str2[i]) {
break;
}
commonLen++;
}
char *prefix = (char *)malloc((commonLen + 1) * sizeof(char));
strncpy(prefix, str1, commonLen);
prefix[commonLen] = '\0';
free(prefix);
return prefix;
}
这个函数用于找到两个字符串数组的最长公共前缀。
例题23:数组中的最大子序列和
int maxSubsequenceSum(int arr[], int n) {
int maxSoFar = 0, maxEndingHere = 0;
for (int i = 0; i < n; i++) {
maxEndingHere = (maxEndingHere + arr[i] > 0) ? maxEndingHere + arr[i] : arr[i];
maxSoFar = (maxSoFar > maxEndingHere) ? maxSoFar : maxEndingHere;
}
return maxSoFar;
}
这个函数用于找到数组中的最大子序列和。
例题24:数组中的最小元素
int findMinimum(int arr[], int n) {
int min = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
return min;
}
这个函数用于找到数组中的最小元素。
例题25:数组中的最大元素
int findMaximum(int arr[], int n) {
int max = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
这个函数用于找到数组中的最大元素。
例题26:数组中的元素移动
void moveElement(int arr[], int n, int k) {
int *temp = (int *)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
temp[(i + k) % n] = arr[i];
}
for (int i = 0; i < n; i++) {
arr[i] = temp[i];
}
free(temp);
}
这个函数用于将数组中的每个元素向右移动k个位置。
例题27:数组中的元素移动(使用索引调整)
void moveElementUsingIndexAdjustment(int arr[], int n, int k) {
int *temp = (int *)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
temp[(i + k) % n] = arr[i];
}
for (int i = 0; i < n; i++) {
arr[i] = temp[i];
}
free(temp);
}
这个函数使用索引调整方法来移动数组中的元素。
例题28:数组中的元素移动(使用循环移位)
void moveElementUsingLoopRotation(int arr[], int n, int k) {
for (int i = 0; i < k; i++) {
int temp = arr[0];
for (int j = 0; j < n - 1; j++) {
arr[j] = arr[j + 1];
}
arr[n - 1] = temp;
}
}
这个函数使用循环移位方法来移动数组中的元素。
例题29:数组中的元素移动(使用切片操作)
void moveElementUsingSlice(int arr[], int n, int k) {
int *temp = (int *)malloc((n - k) * sizeof(int));
for (int i = 0; i < n - k; i++) {
temp[i] = arr[k + i];
}
for (int i = 0; i < n - k; i++) {
arr[k + i] = arr[i];
}
for (int i = 0; i < n - k; i++) {
arr[i] = temp[i];
}
free(temp);
}
这个函数使用切片操作方法来移动数组中的元素。
例题30:数组中的元素移动(使用数组切片和拼接)
void moveElementUsingSliceAndConcatenation(int arr[], int n, int k) {
int *temp = (int *)malloc((n - k) * sizeof(int));
for (int i = 0; i < n - k; i++) {
temp[i] = arr[k + i];
}
int *newArr = (int *)malloc(n * sizeof(int));
for (int i = 0; i < k; i++) {
newArr[i] = arr[i];
}
for (int i = 0; i < n - k; i++) {
newArr[k + i] = temp[i];
}
for (int i = 0; i < n; i++) {
arr[i] = newArr[i];
}
free(temp);
free(newArr);
}
这个函数使用数组切片和拼接方法来移动数组中的元素。
以上是C语言数组应用实战的30个经典例题解析,涵盖了数组的基本操作、排序、查找、合并、旋转等多个方面。通过这些例题的解析,读者可以轻松掌握数组编程技巧,为今后的编程实践打下坚实的基础。
