普通队列按进入顺序出队。优先队列则总是先取优先级最高的元素。二叉堆是实现优先队列的经典结构。
堆不是内存中的“堆区”
这里的 heap 是一种树形数据结构,与 malloc 使用的动态存储区域只是英文同名,概念完全不同。
完全二叉树可以放进数组
最大堆满足:
- 形状是完全二叉树;
- 每个父节点值都不小于孩子。
2026/7/12大约 3 分钟
普通队列按进入顺序出队。优先队列则总是先取优先级最高的元素。二叉堆是实现优先队列的经典结构。
这里的 heap 是一种树形数据结构,与 malloc 使用的动态存储区域只是英文同名,概念完全不同。
最大堆满足:
学完本篇,你会掌握:
-> 运算符的用法。指针不仅可以指向 int、char,也可以指向结构体。用法和之前学的指针一样:
#include <stdio.h>
#include <string.h>
typedef struct {
int id;
char name[20];
float score;
} Student;
int main(void) {
Student s = {1, "Alice", 90.5};
Student *p = &s; // p 指向 s
// 通过 *p 访问成员
printf("学号:%d\n", (*p).id);
printf("姓名:%s\n", (*p).name);
printf("成绩:%.1f\n", (*p).score);
return 0;
}
学完本篇,你会理解:
arr[i] 和 *(arr + i) 为什么完全等价。前面我们学过数组:
int arr[5] = {10, 20, 30, 40, 50};
前面的章节已经覆盖变量、控制流、函数、数组和字符串。现在用一个完整的小项目把这些知识串起来:编写一个能够反复读取成绩、验证输入、统计结果并按菜单操作的程序。
重点不是功能多,而是建立第一次完整的开发流程:
先写需求和数据约束,再拆函数,最后测试边界,而不是想到哪里写到哪里。
程序支持:
0 到 100 的整数成绩;假设你要记录一个班级 50 名学生的成绩。如果不用数组,你得定义 50 个变量:
int score1, score2, score3, /* ... */, score50;
一维数组像一排格子,适合存一条线上的数据,比如一个班的成绩。但如果要存一个班级多次考试的成绩,或者一个二维表格,就需要二维数组。
二维数组可以理解为“数组的数组”,或者说是带行和列的表格。
int scores[3][4]; // 3 行 4 列,共 12 个 int