提示为:
Riverfield乡村走读学校今晚将举办舞会之夜。今晚的舞会将有M个男孩和N个女孩。每个男孩都想和一个比他矮得多的女孩跳舞。一个女孩只能和一个男孩跳舞,反之亦然。考虑到所有男孩和女孩的身高,可以判断是否所有男孩都有可能和女孩跳舞。
输入:第一行包含T,表示测试用例的数量。每个测试用例包含三行。第一行包含M和N。第二行包含M个整数,每个整数表示男孩的身高。第三个包含N个整数,每个整数表示女孩的身高。
输出:如果每个男孩都可以和另一个女孩跳舞,则打印YES。打印NO。
样本输入:
1
4 5
2 5 6 8
3 8 5 1 7
样本输入的输出:
YES
我的代码计划是用女孩和男孩的高度填充两个数组,然后用每个男孩搜索每个女孩。如果男孩的身高大于那个位置的女孩,我想删除那个索引处的女孩,并将女孩身高数组移回一并调整大小。我更改了代码以修复一些语法错误,但现在我得到了一个不同的错误,它无法输出。问题是我得到了这个错误:
已退出,返回代码为-11(SIGSEGV(。
这是我的代码:
//Jacob Hathaway September 11, 2022 Sorting
#include <stdio.h>
#include <stdlib.h>
void remove_girl(int**, int, int, int);
int main() {
int j, h, i, g, testCases, numBoys, numGirls, *boyHeights, *girlHeights;
scanf("%d", &testCases);
for (g = 0; g < testCases; g++) { // For each test case
scanf("%d", &numBoys);
scanf("%d", &numGirls);
boyHeights = (int*)malloc(sizeof(int)*numBoys); //Allocating Memory
girlHeights = (int*)malloc(sizeof(int)*numGirls); //Allocating Memory
for(j = 0; j < numBoys; j++){ // Filling Array
scanf("%d", &h);
*(boyHeights+j) = h;
}
for(j = 0; j < numGirls; j++){ // Filling Array
scanf("%d", &h);
*(girlHeights+j) = h;
}
for(j = 0; j < numBoys; j++){ // For each boy
for(i = 0; i < numGirls; i++){ // Go through each girl
if (girlHeights[i] < boyHeights[j]) { //If the height of the girl at position i is less than boy at position j
remove_girl(&girlHeights, i, numGirls, sizeof(girlHeights)); // Call to function that removes the girl at i and shifts
//numGirls -= 1;
}
}
}
if (((int(sizeof(girlHeights)) - int(sizeof(boyHeights))) <= (numGirls - numBoys))) {
printf("YESn");
}
else {
printf("NOn");
}
}
free(boyHeights);
free(girlHeights);
return 0;
}
void remove_girl(int **girlHeights, int index, int numGirls, int size) { //removes girl at index and shifts array back
long unsigned int p;
for(p = index; p < sizeof(girlHeights) - 1; p++) girlHeights[p] = girlHeights[p+1];
*girlHeights = (int*)malloc(sizeof(int)*(numGirls-1));
}
在remove_girl()
:中
-
如果要更改
girlHeights
,请将指针传递给它。 -
消除
int size
参数,因为您没有使用它。 -
你的循环是错误的。
sizeof(pointer)
是存储指针的字节数,可能为8,与指针指向的数据无关 -
(次要,不固定(更喜欢使用无符号类型作为索引和大小(例如
size_t
(。您希望更新所有变量以避免混合,并防止其中任何一个变为负数(例如,如果在双循环中出现numGirls == 0
,会发生什么?(。 -
您需要使用
realloc()
而不是malloc()
来调整数组的大小。当您使用malloc()
时,您会创建一个新的内存块,丢失以前存储的数据,并泄漏旧内存。
void remove_girl(int **girlHeights, int index, int numGirls) {
for(int i = index; i < numGirls - 1; i++)
(*girlHeights)[i] = (*girlHeights)[i + 1];
void *tmp = realloc(*girlHeights, (numGirls - 1) * sizeof(**girlHeights));
if(!tmp) {
printf("realloc failedn");
exit(1);
}
*girlHeights = tmp;
}
并将呼叫更新为:
remove_girl(&girlHeights, i, numGirls);
这解决了您的segfault:
$ ./a.out
1
4 5
2 5 6 8
3 8 5 1 7
YES