数据结构-C语言版本(一)数组

数据结构中的数组:概念、操作与实战

第一部分 数组分类及常见形式

数组是最基本的数据结构之一,它是由相同类型的元素按一定顺序排列的集合,在内存中占据连续的空间。数组可以分为以下几类:

1. 一维数组

最基本的数组形式,元素线性排列。

c 复制代码
// 声明并初始化一个一维数组
int numbers[5] = {1, 2, 3, 4, 5};

2. 多维数组

常见的是二维数组(矩阵),可以看作数组的数组。

c 复制代码
// 声明并初始化一个二维数组
int matrix[3][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

3. 动态数组

大小可以在运行时确定的数组,通常需要手动管理内存。

c 复制代码
// 动态数组示例
int size = 10;
int *dynamicArray = (int*)malloc(size * sizeof(int));
// 使用后不要忘记释放内存
free(dynamicArray);

4. 字符数组

C语言中用字符数组表示字符串。

c 复制代码
char str[] = "Hello, World!";

第二部分 数组常见操作

1. 遍历数组

c 复制代码
// 遍历一维数组
for(int i = 0; i < 5; i++) {
    printf("%d ", numbers[i]);
}

// 遍历二维数组
for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 3; j++) {
        printf("%d ", matrix[i][j]);
    }
    printf("\n");
}

2. 插入元素

c 复制代码
// 在指定位置插入元素
void insertElement(int arr[], int size, int pos, int value) {
    for(int i = size - 1; i > pos; i--) {
        arr[i] = arr[i-1];
    }
    arr[pos] = value;
}

3. 删除元素

c 复制代码
// 删除指定位置的元素
void deleteElement(int arr[], int size, int pos) {
    for(int i = pos; i < size - 1; i++) {
        arr[i] = arr[i+1];
    }
    arr[size-1] = 0; // 可选,将最后一个元素置0
}

4. 查找元素

c 复制代码
// 线性查找
int linearSearch(int arr[], int size, int target) {
    for(int i = 0; i < size; i++) {
        if(arr[i] == target) {
            return i;
        }
    }
    return -1; // 未找到
}

// 二分查找(要求数组已排序)
int binarySearch(int arr[], int size, int target) {
    int left = 0, 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;
}

5. 排序数组

c 复制代码
// 冒泡排序
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;
            }
        }
    }
}

第三部分 数组编程题例子

1. 寻找数组中的最大值和最小值

c 复制代码
void findMinMax(int arr[], int size, int *min, int *max) {
    *min = *max = arr[0];
    for(int i = 1; i < size; i++) {
        if(arr[i] < *min) *min = arr[i];
        if(arr[i] > *max) *max = arr[i];
    }
}

2. 数组反转

c 复制代码
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;
    }
}

3. 移除数组中的重复元素

c 复制代码
int removeDuplicates(int arr[], int size) {
    if(size == 0) return 0;
    
    int index = 0;
    for(int i = 1; i < size; i++) {
        if(arr[i] != arr[index]) {
            index++;
            arr[index] = arr[i];
        }
    }
    return index + 1;
}

4. 两数之和(找出数组中相加等于目标值的两个数)

c 复制代码
void twoSum(int arr[], int size, int target) {
    for(int i = 0; i < size - 1; i++) {
        for(int j = i + 1; j < size; j++) {
            if(arr[i] + arr[j] == target) {
                printf("找到两数: %d 和 %d\n", arr[i], arr[j]);
                return;
            }
        }
    }
    printf("未找到符合条件的两个数\n");
}

5. 旋转数组

c 复制代码
void rotateArray(int arr[], int size, int k) {
    k = k % size; // 处理k大于数组长度的情况
    // 反转整个数组
    reverseArray(arr, size);
    // 反转前k个元素
    reverseArray(arr, k);
    // 反转剩余元素
    reverseArray(arr + k, size - k);
}

6. 合并两个有序数组

c 复制代码
void mergeSortedArrays(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++];
}

数组是编程中最基础也是最重要的数据结构之一,掌握数组的操作和常见算法对提升编程能力至关重要。通过不断练习这些基础题目,可以加深对数组特性的理解,并为学习更复杂的数据结构打下坚实基础。

相关推荐
伊H2 小时前
C语言main的参数;argc与argv
linux·c语言·算法
Non importa4 小时前
【初阶数据结构】树——二叉树(上)
c语言·数据结构·学习·算法
汤姆_5116 小时前
【c语言】深度理解指针4——sizeof和strlen
c语言·开发语言
_GR6 小时前
2025年蓝桥杯第十六届C&C++大学B组真题及代码
c语言·数据结构·c++·算法·贪心算法·蓝桥杯·动态规划
shinelord明7 小时前
【软件系统架构】事件驱动架构
数据结构·设计模式·架构·系统架构·软件工程
照海19Gin8 小时前
数据结构中的宝藏秘籍之广义表
c语言·数据结构·算法
加点油。。。。8 小时前
C语言高频面试题——strcpy与memcpy区别
c语言·开发语言
大炮筒8 小时前
CPPlist初识
数据结构·c++·list
浅浅2808 小时前
numpy、pandas内存优化操作整理
数据结构·经验分享·python·学习·性能优化·numpy·pandas