Linux环境下的C语言编程(四十八)

数组和广义表

先复习一下数组

一、一维数组

1. 基本概念

一维数组 是最简单的数组形式,它由相同数据类型 的元素按线性顺序排列而成。

重要特性

  • 所有元素类型相同

  • 元素在内存中连续存储

  • 通过下标/索引访问元素

  • 下标从0开始(C语言)

2. 内存表示

复制代码
内存地址: 1000   1004   1008   1012   1016
元素值:   arr[0] arr[1] arr[2] arr[3] arr[4]
           ─────  ─────  ─────  ─────  ─────
            10     20     30     40     50
索引:       0      1      2      3      4

3. 示例

复制代码
#include <stdio.h>

int main() {
    // 声明和初始化一维数组
    int scores[5];              // 声明一个包含5个整数的数组
    int ages[] = {18, 19, 20, 21, 22};  // 声明并初始化
    float temperatures[3] = {36.5, 37.0, 36.8};
    
    // 2. 数组赋值
    scores[0] = 95;  // 第一个元素
    scores[1] = 88;
    scores[2] = 76;
    scores[3] = 92;
    scores[4] = 85;
    
    // 3. 访问数组元素
    printf("第一个学生的分数: %d\n", scores[0]);
    printf("第三个学生的分数: %d\n", scores[2]);
    
    // 4. 遍历数组
    printf("所有学生的分数: ");
    for(int i = 0; i < 5; i++) {
        printf("%d ", scores[i]);
    }
    printf("\n");
    
    // 5. 计算数组长度
    int count = sizeof(scores) / sizeof(scores[0]);
    printf("数组元素个数: %d\n", count);
    
    // 6. 计算平均值
    int sum = 0;
    for(int i = 0; i < 5; i++) {
        sum += scores[i];
    }
    float average = sum / 5.0;
    printf("平均分: %.2f\n", average);
    
    return 0;
}

4. 实际应用场景

复制代码
// 场景1:存储学生姓名
#include <string.h>

int main() {
    char students[3][20] = {
        "张三",
        "李四", 
        "王五"
    };
    
    for(int i = 0; i < 3; i++) {
        printf("学生%d: %s\n", i+1, students[i]);
    }
    
    int votes[5] = {0};  // 初始化所有元素为0
    // 假设投票给候选人1,2,3...
    votes[0]++;  // 投给候选人1
    votes[2]++;  // 投给候选人3
    votes[2]++;  // 再次投给候选人3
    
    printf("\n投票结果:\n");
    for(int i = 0; i < 5; i++) {
        printf("候选人%d: %d票\n", i+1, votes[i]);
    }
    
    return 0;
}

二、二维数组

1. 基本概念

二维数组 是"数组的数组",可以看作是一个表格矩阵

重要特性

  • 有行和列两个维度

  • 行优先方式存储

  • 需要两个下标访问:arr[row][col]

2. 内存表示(行优先存储)

复制代码
二维视图:
      列0  列1  列2  列3
行0: [0,0][0,1][0,2][0,3]
行1: [1,0][1,1][1,2][1,3]
行2: [2,0][2,1][2,2][2,3]

内存中的实际存储:
[0,0][0,1][0,2][0,3][1,0][1,1][1,2][1,3][2,0][2,1][2,2][2,3]

3. C语言示例

复制代码
#include <stdio.h>

int main() {
    // 1. 声明和初始化二维数组
    int matrix[3][4];  // 3行4列的矩阵
    
    // 2. 初始化方式1:逐个赋值
    matrix[0][0] = 1; matrix[0][1] = 2; matrix[0][2] = 3; matrix[0][3] = 4;
    matrix[1][0] = 5; matrix[1][1] = 6; matrix[1][2] = 7; matrix[1][3] = 8;
    matrix[2][0] = 9; matrix[2][1] = 10; matrix[2][2] = 11; matrix[2][3] = 12;
    
    // 3. 初始化方式2:声明时初始化
    int chessboard[8][8] = {0};  // 8x8棋盘,全部初始化为0
    
    int scores[3][2] = {
        {85, 90},  // 第一个学生的两门课成绩
        {78, 82},  // 第二个学生
        {92, 88}   // 第三个学生
    };
    
    // 4. 访问元素
    printf("第2行第3列的元素: %d\n", matrix[1][2]);  // 注意:下标从0开始
    
    // 5. 遍历二维数组(行优先)
    printf("\n矩阵内容:\n");
    for(int row = 0; row < 3; row++) {
        for(int col = 0; col < 4; col++) {
            printf("%d\t", matrix[row][col]);
        }
        printf("\n");  // 每行结束后换行
    }
    
    // 6. 计算每行总和
    printf("\n每行的总和:\n");
    for(int row = 0; row < 3; row++) {
        int rowSum = 0;
        for(int col = 0; col < 4; col++) {
            rowSum += matrix[row][col];
        }
        printf("第%d行总和: %d\n", row+1, rowSum);
    }
    
    // 7. 计算每列平均值
    printf("\n每列的平均值:\n");
    for(int col = 0; col < 4; col++) {
        int colSum = 0;
        for(int row = 0; row < 3; row++) {
            colSum += matrix[row][col];
        }
        float colAvg = colSum / 3.0;
        printf("第%d列平均值: %.2f\n", col+1, colAvg);
    }
    
    return 0;
}
相关推荐
_OP_CHEN5 小时前
【算法基础篇】(五十七)线性代数之矩阵乘法从入门到实战:手撕模板 + 真题详解
线性代数·算法·矩阵·蓝桥杯·c/c++·矩阵乘法·acm/icpc
天天爱吃肉82185 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
im_AMBER5 小时前
Leetcode 114 链表中的下一个更大节点 | 删除排序链表中的重复元素 II
算法·leetcode
xhbaitxl5 小时前
算法学习day38-动态规划
学习·算法·动态规划
多恩Stone5 小时前
【3D AICG 系列-6】OmniPart 训练流程梳理
人工智能·pytorch·算法·3d·aigc
历程里程碑5 小时前
普通数组----轮转数组
java·数据结构·c++·算法·spring·leetcode·eclipse
pp起床5 小时前
贪心算法 | part02
算法·leetcode·贪心算法
sin_hielo5 小时前
leetcode 1653
数据结构·算法·leetcode
2501_901147835 小时前
面试必看:优势洗牌
笔记·学习·算法·面试·职场和发展
李日灐5 小时前
C++进阶必备:红黑树从 0 到 1: 手撕底层,带你搞懂平衡二叉树的平衡逻辑与黑高检验
开发语言·数据结构·c++·后端·面试·红黑树·自平衡二叉搜索树