C语言数组

数组详解

数组是C语言中存储相同类型数据的集合。

数组的主要特点:

  • 一维数组
  • 多维数组
  • 字符数组(字符串)
  • 数组作为函数参数
  • 动态数组
  • 数组操作(排序、查找等)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 函数声明
void printArray(int arr[], int size);
void bubbleSort(int arr[], int size);
int binarySearch(int arr[], int size, int target);
void rotateArray(int arr[], int size, int k);
void mergeArrays(int arr1[], int size1, int arr2[], int size2, int result[]);
void findDuplicates(int arr[], int size);
void findMissingNumber(int arr[], int size);
void reverseArray(int arr[], int size);
void printSpiral(int matrix[][4], int rows, int cols);
void transposeMatrix(int matrix[][4], int rows, int cols);

int main() {
    // 一维数组示例
    printf("一维数组示例:\n");
    int numbers[] = {5, 2, 8, 1, 9, 3, 7, 4, 6};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    
    printf("原始数组:");
    printArray(numbers, size);
    
    // 数组排序
    printf("\n排序后数组:");
    bubbleSort(numbers, size);
    printArray(numbers, size);
    
    // 二分查找
    printf("\n二分查找示例:\n");
    int target = 7;
    int index = binarySearch(numbers, size, target);
    if (index != -1) {
        printf("找到%d,位置在:%d\n", target, index);
    } else {
        printf("未找到%d\n", target);
    }
    
    // 数组旋转
    printf("\n数组旋转示例:\n");
    int arr[] = {1, 2, 3, 4, 5};
    int arrSize = sizeof(arr) / sizeof(arr[0]);
    printf("原始数组:");
    printArray(arr, arrSize);
    rotateArray(arr, arrSize, 2);
    printf("旋转2位后:");
    printArray(arr, arrSize);
    
    // 数组合并
    printf("\n数组合并示例:\n");
    int arr1[] = {1, 3, 5, 7};
    int arr2[] = {2, 4, 6, 8};
    int size1 = sizeof(arr1) / sizeof(arr1[0]);
    int size2 = sizeof(arr2) / sizeof(arr2[0]);
    int result[size1 + size2];
    
    mergeArrays(arr1, size1, arr2, size2, result);
    printf("合并后数组:");
    printArray(result, size1 + size2);
    
    // 查找重复元素
    printf("\n查找重复元素示例:\n");
    int duplicates[] = {1, 2, 3, 4, 2, 5, 6, 3, 7};
    int dupSize = sizeof(duplicates) / sizeof(duplicates[0]);
    printf("原始数组:");
    printArray(duplicates, dupSize);
    findDuplicates(duplicates, dupSize);
    
    // 查找缺失数字
    printf("\n查找缺失数字示例:\n");
    int missing[] = {0, 1, 3, 4, 5, 6, 7, 8, 9};
    int missSize = sizeof(missing) / sizeof(missing[0]);
    printf("原始数组:");
    printArray(missing, missSize);
    findMissingNumber(missing, missSize);
    
    // 数组反转
    printf("\n数组反转示例:\n");
    int reverse[] = {1, 2, 3, 4, 5};
    int revSize = sizeof(reverse) / sizeof(reverse[0]);
    printf("原始数组:");
    printArray(reverse, revSize);
    reverseArray(reverse, revSize);
    printf("反转后数组:");
    printArray(reverse, revSize);
    
    // 二维数组示例
    printf("\n二维数组示例:\n");
    int matrix[4][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
        {13, 14, 15, 16}
    };
    
    printf("原始矩阵:\n");
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%3d ", matrix[i][j]);
        }
        printf("\n");
    }
    
    // 螺旋打印
    printf("\n螺旋打印矩阵:\n");
    printSpiral(matrix, 4, 4);
    
    // 矩阵转置
    printf("\n矩阵转置:\n");
    transposeMatrix(matrix, 4, 4);
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            printf("%3d ", matrix[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

// 函数定义
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

void bubbleSort(int arr[], int size) {
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int binarySearch(int arr[], int size, int target) {
    int left = 0;
    int right = size - 1;
    
    while (left <= right) {
        int mid = left + (right - left) / 2;
        
        if (arr[mid] == target) {
            return mid;
        }
        
        if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    
    return -1;
}

void rotateArray(int arr[], int size, int k) {
    k = k % size;
    int temp[k];
    
    // 保存后k个元素
    for (int i = 0; i < k; i++) {
        temp[i] = arr[size - k + i];
    }
    
    // 移动前size-k个元素
    for (int i = size - 1; i >= k; i--) {
        arr[i] = arr[i - k];
    }
    
    // 将保存的元素放到前面
    for (int i = 0; i < k; i++) {
        arr[i] = temp[i];
    }
}

void mergeArrays(int arr1[], int size1, int arr2[], int size2, int result[]) {
    int i = 0, j = 0, k = 0;
    
    while (i < size1 && j < size2) {
        if (arr1[i] <= arr2[j]) {
            result[k++] = arr1[i++];
        } else {
            result[k++] = arr2[j++];
        }
    }
    
    while (i < size1) {
        result[k++] = arr1[i++];
    }
    
    while (j < size2) {
        result[k++] = arr2[j++];
    }
}

void findDuplicates(int arr[], int size) {
    printf("重复元素:");
    for (int i = 0; i < size; i++) {
        for (int j = i + 1; j < size; j++) {
            if (arr[i] == arr[j]) {
                printf("%d ", arr[i]);
                break;
            }
        }
    }
    printf("\n");
}

void findMissingNumber(int arr[], int size) {
    int expectedSum = (size * (size + 1)) / 2;
    int actualSum = 0;
    
    for (int i = 0; i < size; i++) {
        actualSum += arr[i];
    }
    
    printf("缺失的数字是:%d\n", expectedSum - actualSum);
}

void reverseArray(int arr[], int size) {
    for (int i = 0; i < size / 2; i++) {
        int temp = arr[i];
        arr[i] = arr[size - i - 1];
        arr[size - i - 1] = temp;
    }
}

void printSpiral(int matrix[][4], int rows, int cols) {
    int top = 0, bottom = rows - 1;
    int left = 0, right = cols - 1;
    
    while (top <= bottom && left <= right) {
        // 打印上边
        for (int i = left; i <= right; i++) {
            printf("%d ", matrix[top][i]);
        }
        top++;
        
        // 打印右边
        for (int i = top; i <= bottom; i++) {
            printf("%d ", matrix[i][right]);
        }
        right--;
        
        // 打印下边
        if (top <= bottom) {
            for (int i = right; i >= left; i--) {
                printf("%d ", matrix[bottom][i]);
            }
            bottom--;
        }
        
        // 打印左边
        if (left <= right) {
            for (int i = bottom; i >= top; i--) {
                printf("%d ", matrix[i][left]);
            }
            left++;
        }
    }
    printf("\n");
}

void transposeMatrix(int matrix[][4], int rows, int cols) {
    for (int i = 0; i < rows; i++) {
        for (int j = i + 1; j < cols; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }
}