在 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 1return -1

问题来了

            if (people[j+1]==NULL) 
            {
                continue;
            }

您需要检查 jj+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);
}