0

したがって、以下に示すように、ポインターの配列をソートしようとしています。私が抱えている問題は、配列に null 要素が 1 つ含まれていることです。もちろん、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 に答える