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;
}
相关推荐
Yingye Zhu(HPXXZYY)2 小时前
Solution to Luogu P6340
算法
小熳芋2 小时前
单词搜索- python-dfs&剪枝
算法·深度优先·剪枝
Xの哲學3 小时前
Linux SLAB分配器深度解剖
linux·服务器·网络·算法·边缘计算
bu_shuo3 小时前
MATLAB中的转置操作及其必要性
开发语言·算法·matlab
高洁013 小时前
图神经网络初探(2)
人工智能·深度学习·算法·机器学习·transformer
爱装代码的小瓶子3 小时前
算法【c++】二叉树搜索树转换成排序双向链表
c++·算法·链表
思成Codes3 小时前
数据结构:基础线段树——线段树系列(提供模板)
数据结构·算法
虾..5 小时前
Linux 简单日志程序
linux·运维·算法
Trent19855 小时前
影楼精修-眼镜祛反光算法详解
图像处理·人工智能·算法·计算机视觉·aigc