数组和广义表
先复习一下数组
一、一维数组
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;
}
