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;
}
相关推荐
junziruruo2 分钟前
t-SNE可视化降维技术(以FMTrack频率感知与多专家融合文章中的内容为例)
人工智能·算法
藦卡机器人12 分钟前
自动焊接机器人的核心技术要求与标准
人工智能·算法·机器人
2501_9403152629 分钟前
【无标题】1.17给定一个数将其转换为任意一个进制数(用栈的方法)
开发语言·c++·算法
栈与堆31 分钟前
LeetCode 21 - 合并两个有序链表
java·数据结构·python·算法·leetcode·链表·rust
viqjeee39 分钟前
ALSA驱动开发流程
数据结构·驱动开发·b树
鹿角片ljp1 小时前
力扣7.整数反转-从基础到边界条件
算法·leetcode·职场和发展
java修仙传1 小时前
力扣hot100:前K个高频元素
算法·leetcode·职场和发展
嗷嗷哦润橘_2 小时前
从萝卜纸巾猫到桌游:“蒸蚌大开门”的设计平衡之旅
人工智能·算法·游戏·概率论·桌游
XH华2 小时前
数据结构第九章:树的学习(上)
数据结构·学习
TracyCoder1232 小时前
Java String:从内存模型到不可变设计
java·算法·string