在 C 中用空值对数组进行冒泡排序
Bubble sorting an array with nulls in C
我正在尝试在 C 中创建一个中间有空值的冒泡排序。
当数组以某种方式排序时,代码工作正常,因此空值位于数组的末尾(因此 "continue" 条件有效)。
我的数组如下所示:[John,David,NULL,Grace,NULL,NULL]
我 运行 这个功能:
void SortContacts(char * people[]) {
int i,j;
char *tempswap;
for (i=0; i<storage-1; i++) {
for (j=0; j<storage-i-1; j++) {
if (people[j+1]==NULL) {
continue;
}
if (strcmp(people[j],people[j+1]) > 0) {
tempswap = people[j];
people[j] = people[j+1];
people[j+1] = tempswap;
}
}
}
}
在数组中间使用 NULL 执行时,exe 崩溃。
您不能strcmp
NULL
值。虽然你在防止 people[j+1]
的 strcmp
成为 NULL
,但你没有检查 people[j]
.
尝试以下(未经测试),它仅提供一个 strcmp
函数,将 NULL
视为“”。
int
strcmpwithnull(const char *a, const char *b)
{
return strcmp(a?a:"", b?b:"");
}
void SortContacts(char * people[]) {
int i,j;
char *tempswap;
for (i=0; i<storage-1; i++) {
for (j=0; j<storage-i-1; j++) {
if (strcmpwithnull(people[j],people[j+1]) > 0) {
tempswap = people[j];
people[j] = people[j+1];
people[j+1] = tempswap;
}
}
}
}
如果您希望 NULL
被视为比任何其他字符串 更大 ,请尝试(再次未经测试):
int
strcmpwithnull(const char *a, const char *b)
{
if (a == b)
return 0; /* handles 2 NULLs and two strings at the same location */
else if (!a)
return 1;
else if (!b)
return -1;
else
return strcmp(a, b);
}
如果您希望它们小于任何其他字符串(包括空字符串),请交换 return 1
和 return -1
。
问题来了
if (people[j+1]==NULL)
{
continue;
}
您需要检查 j
和 j+1
还要考虑如果数组的头部有一个 NULL
怎么办?或者你有 2 NULLs
个接一个
所以你还需要检查 j
而不仅仅是 j+1
你还应该检查j
不是null
您想以数组右侧的空值结束。这可以通过使空值严格大于任何字符串来实现。您必须将其编码到比较函数中。
int cmp(const char *x, const char *y)
{ if(x == 0) return 1;
if(y == 0) return -1;
return strcmp(x, y);
}
我正在尝试在 C 中创建一个中间有空值的冒泡排序。
当数组以某种方式排序时,代码工作正常,因此空值位于数组的末尾(因此 "continue" 条件有效)。
我的数组如下所示:[John,David,NULL,Grace,NULL,NULL] 我 运行 这个功能:
void SortContacts(char * people[]) {
int i,j;
char *tempswap;
for (i=0; i<storage-1; i++) {
for (j=0; j<storage-i-1; j++) {
if (people[j+1]==NULL) {
continue;
}
if (strcmp(people[j],people[j+1]) > 0) {
tempswap = people[j];
people[j] = people[j+1];
people[j+1] = tempswap;
}
}
}
}
在数组中间使用 NULL 执行时,exe 崩溃。
您不能strcmp
NULL
值。虽然你在防止 people[j+1]
的 strcmp
成为 NULL
,但你没有检查 people[j]
.
尝试以下(未经测试),它仅提供一个 strcmp
函数,将 NULL
视为“”。
int
strcmpwithnull(const char *a, const char *b)
{
return strcmp(a?a:"", b?b:"");
}
void SortContacts(char * people[]) {
int i,j;
char *tempswap;
for (i=0; i<storage-1; i++) {
for (j=0; j<storage-i-1; j++) {
if (strcmpwithnull(people[j],people[j+1]) > 0) {
tempswap = people[j];
people[j] = people[j+1];
people[j+1] = tempswap;
}
}
}
}
如果您希望 NULL
被视为比任何其他字符串 更大 ,请尝试(再次未经测试):
int
strcmpwithnull(const char *a, const char *b)
{
if (a == b)
return 0; /* handles 2 NULLs and two strings at the same location */
else if (!a)
return 1;
else if (!b)
return -1;
else
return strcmp(a, b);
}
如果您希望它们小于任何其他字符串(包括空字符串),请交换 return 1
和 return -1
。
问题来了
if (people[j+1]==NULL)
{
continue;
}
您需要检查 j
和 j+1
还要考虑如果数组的头部有一个 NULL
怎么办?或者你有 2 NULLs
个接一个
所以你还需要检查 j
而不仅仅是 j+1
你还应该检查j
不是null
您想以数组右侧的空值结束。这可以通过使空值严格大于任何字符串来实现。您必须将其编码到比较函数中。
int cmp(const char *x, const char *y)
{ if(x == 0) return 1;
if(y == 0) return -1;
return strcmp(x, y);
}