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;
}
相关推荐
辛苦才能4 小时前
数据结构--排序--插入排序(C语言,重点排序面试和比赛都会考察)
c语言·数据结构·面试
超级码力66613 小时前
【Latex文件架构】Latex文件架构模板
算法·数学建模·信息可视化
穿条秋裤到处跑13 小时前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
Merlos_wind13 小时前
HashMap详解
算法·哈希算法·散列表
汉克老师14 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
Yzzz-F16 小时前
Problem - 2205D - Codeforces
算法
智者知已应修善业17 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
Halo_tjn17 小时前
Java Set集合相关知识点
java·开发语言·算法
生成论实验室18 小时前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星18 小时前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算