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;
}
相关推荐
Liu628882 小时前
C++中的工厂模式高级应用
开发语言·c++·算法
AI科技星3 小时前
全尺度角速度统一:基于 v ≡ c 的纯推导与验证
c语言·开发语言·人工智能·opencv·算法·机器学习·数据挖掘
条tiao条3 小时前
KMP 算法详解:告别暴力匹配,让字符串匹配 “永不回头”
开发语言·算法
干啥啥不行,秃头第一名4 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
tobias.b4 小时前
计算机基础知识-数据结构
java·数据结构·考研
zzh940774 小时前
Gemini 3.1 Pro 硬核推理优化剖析:思维织锦、动态计算与国内实测
算法
2301_807367194 小时前
C++中的解释器模式变体
开发语言·c++·算法
愣头不青4 小时前
617.合并二叉树
java·算法
MIUMIUKK5 小时前
双指针三大例题
算法
灵感__idea5 小时前
Hello 算法:复杂问题的应对策略
前端·javascript·算法