0

所以我试图对一组指针进行排序,如下所示。我遇到的问题是数组包含一个空元素。我必须取消引用除 NULL 以外的所有元素,否则我当然会收到错误,但这会导致我的排序在 NULL 出现后无法正确排序任何元素。我可以为 NULL 情况创建一个特定的异常,但是有没有办法避免这种情况,并且在我仍然取消引用其他所有内容的同时将 NULL 处理为 0?现在我告诉排序忽略NULL。这只是一个占位符,因为我无法找到解决问题的方法。

#include <stdio.h>
#include <stdlib.h>

void arr(int ar[], int ele);

int main(){
    int a=0, b=9, x=3, p=2, *ar[]={&a, &b, &x, NULL, &p}, i=0, ele=(sizeof(ar)/sizeof(ar[0]));
    arr(ar, ele);
    printf("\n\n");
    for(;i<ele;i++){
        if(ar[i]==NULL){
            printf("");
        }else{
     printf("%i", *ar[i]);
        }
    }
}

void arr(int *ar[], int ele){
    int i=ele-1, c=0;
    for(;i>0; i--){
        for(;c<i; c++){
            if((ar[c]!=NULL && ar[c+1]!=NULL) && *ar[c]>*ar[c+1]){
                int t=*ar[c+1];
                *ar[c+1]=*ar[c];
                *ar[c]=t;
            }
        }
    }
}
4

4 回答 4

2

改变这个

if((ar[c]!=NULL && ar[c+1]!=NULL) && *ar[c]>*ar[c+1]){

//If the pointer is NULL, it will have a value of 0, so the conditional will be false.
x = (ar[c]) ? *ar[c] : 0;
y = (ar[c+1]) ? *ar[c+1] : 0;
if(x > y){

添加 int x,y; 到函数的顶部。

编辑:添加了取消引用指针。哈哈

于 2012-05-07T02:32:17.117 回答
1

你让如何

Int *ptNull = new int;
*ptNull = -100(the smallest);

然后你首先在数组中找到那个NULL,并将它设置为ptNull。
然后您可以像数组中没有 NULL 一样进行排序。

于 2012-05-07T02:25:13.410 回答
1

NULL 应该先排序还是最后排序?决定。该决定控制您的比较代码:

if (compare(ar[c], ar[c+1]) < 0)
{
    int t=*ar[c+1];
    *ar[c+1]=*ar[c];
    *ar[c]=t;
}

在哪里:

static int compare(int const *v1, int const *v2)
{
    if (v1 == NULL)
        return -1;
    if (v2 == NULL)
        return +1;
    if (*v1 < *v2)
        return -1;
    if (*v1 > *v2)
        return +1;
    return 0;
}

这会将 NULL 排序在任何有效值之前。


你还有一个问题:

void arr(int ar[], int ele);

对比

void arr(int *ar[], int ele){

这些不是同一个签名;你的代码不应该被编译。

于 2012-05-07T02:33:50.407 回答
1
    for(;c<i; c++){
        int left = ar[c] != NULL ? ar[c] : 0;
        int right = ar[c+1] != NULL ? ar[c+1] : 0;

        if (left > right){
            /* swap the pointers, not what they point to! */
            int *t = ar[c+1];
            ar[c+1] = ar[c];
            ar[c] = t;
        }
    }
于 2012-05-07T02:35:42.737 回答