printf("班次号:%d\n", flights[i].flightNumber);
printf("起飞时间:%s\n", flights[i].departureTime);
printf("线路:%s\n", flights[i].route);
printf("飞行时间:%d\n", flights[i].flightDuration);
printf("载客量:%d\n", flights[i].seatingCapacity);
printf("\n");
}
}
printf("未找到匹配的班次信息。\n");
}
打印班次号,起飞时间,线路,飞行时间,载客量,未找到匹配的班次信息等
这代码中英文对照的,前面提示是中文,后面变量是英文,就算你不会编程,也应该能看懂。
不知道你这个问题是否已经解决, 如果还没有解决的话: void AdjustUp(int* a, int child)
{
int parent = (child - 1) / 2;
//while (parent >= 0) 不对的 parent不会小于0
while (child > 0)
{
if (a[child] < a[parent])
{
Swap(&a[child], &a[parent]);
child = parent;
parent = (child - 1) / 2;
}
else
{
break;
}
}
}
从叶子节点插入一个元素后,想要继续保持堆的结构不变。从下往上,对二叉树进行调整,确保最后是小堆。
图示过程如下:
1.未进行插入新元素的堆:
2.新元素0
3.新元素0跟此时的父亲节点5比较,比5小,交换
4.然后0继续和新的父亲节点2比较,比2小,交换
5.然后0继续和新的父亲节点0进行比较,比1小,交换
运用错位相减计算
这里以建立小堆为例,我们需要保证小堆的结构,这里通过自下而上进行调整。
这里提一嘴为什么建堆过程中的for循环内i初始值设置为(n-1-1)/2,首先数组最后一个元素下标是n-1,又有child=2*parent+1,带入后就是这个初始值。
void HeapInit(HP* php, HPDataTpye* a, int n)
{
assert(php);
php->a = (HPDataTpye*)malloc(sizeof(HPDataTpye)*n);
if (php->a == NULL)
{
printf("malloc fail\n");
exit(-1);
}
memcpy(php->a, a, sizeof(HPDataTpye)*n);
// 建堆
for (int i = (n-2)/2; i >= 0; --i)
{
AdjustDown(php->a, n, i);
}
php->size = n;
php->capacity = n;
}
直接free掉a,然后把php->a置空,并把size和capacity置0
void HeapDestroy(HP* php)
{
assert(php);
free(php->a);
php->a = NULL;
php->size = php->capacity = 0;
}
1.先判断下空间是否满了,若满了,realloc开辟一块新的空间,没满就不需要开辟。
2.然后把新插入的元素放在最后一个叶子节点处
3.接下来与其双亲结点进行比较,如果比双亲结点小,就交换其值,一直不断重叠
4.最后如果该数据比双亲结点值大,就结束调整;如果当child等于0,就结束调整
// 插入x,保持他继续是堆
void HeapPush(HP* php, HPDataTpye x)
{
assert(php);
if (php->size == php->capacity)
{
HPDataTpye* tmp = (HPDataTpye*)realloc(php->a, php->capacity * 2 * sizeof(HPDataTpye));
if (php->a == NULL)
{
printf("realloc fail\n");
exit(-1);
}
php->capacity *= 2;
}
php->a[php->size] = x;
php->size++;
AdjustUp(php->a, php->size - 1);
}