0

私が問題を抱えているのは、buildHeap と buildMinHeap のものです。以前は、それらはまったくトリガーされませんでした。そのため、ソートされていない配列の場合、ノードが適切に印刷されるため、印刷部分が多かれ少なかれ機能するはずです。

現在、入力したデバッグ メッセージの一部を表示した後にプログラムがクラッシュするため、そこに無限ループがあると想定しています。何か案は?

#include <stdio.h>

#define ARRAY_SIZE 10

int parent(int i) {
    return i/2;
}

int left(int i) {
    return 2*i;
}

int right(int i) {
    return 2*i+1;
}

void heapify(int A[], int i, int s) {
    int m = i;
    int temp;
    int l = left(i);
    int r = right(i);

    if (l <= s && A[l] > A[m]) m = l;
    if (r <= s && A[r] > A[m]) m = r;
    if (i != m) {
        temp = A[i];
        A[i] = A[m];
        A[m] = temp;
        heapify(A, m, s);
    }
    printf("heapify done\n");

}

void buildHeap(int A[]) {
    int i;

    for (i = ARRAY_SIZE / 2; i > 0; i--) {
        heapify(A, i, ARRAY_SIZE);
    }
    printf("buildHeap done\n");
}

// this still creates a normal heap, not a min heap afaik
void buildMinHeap(int A[]) {
    int s = ARRAY_SIZE - 1;
    int i;
    int temp;

    buildHeap(A);

    for (i = ARRAY_SIZE; i > 1; i--) {
        temp = A[i];
        A[i] = A[1];
        A[1] = temp;
        s = s-1;
        heapify(A, 1, s);
    }
}

void printHeap(int A[]) {
    int i;

    printf("graph g {\n");

    for (i = 0; i < ARRAY_SIZE; i++) {
        printf("%d -- %d\n", parent(i), A[i]);
    }

    printf(" }\n");

    //temp debug code
    printf("[ ");
    i = 0;
    for (i = 0; i < ARRAY_SIZE; i++) {
    printf("%d", A[i]);
    if (i < ARRAY_SIZE - 1) printf(", ");
    }
    printf(" ]\n");
}

int main() {
    int array[ARRAY_SIZE] = {4, 3, 2, 5, 6, 7, 8, 9, 12, 1};

    buildMinHeap(array);
    printHeap(array);
}

編集:ああ、また、私はまだ学生なので、まだCに精通していません。いくつかのコンテキストを提供するだけです。

4

1 に答える 1

0

C では、配列はゼロベースのインデックスを使用します。つまり、10 個の要素を持つ配列には、0 から 9 までの要素インデックスがあります。

1配列要素が からにインデックス付けされると想定しているように見えますがARRAY_SIZE、実際には にインデックス付けされ0ていますARRAY_SIZE - 1

main配列で何かをしようとする前に、配列の内容を出力するだけの非常に単純な関数を試してください。

#include <stdio.h>

#define ARRAY_SIZE    10

int main(void)
{
    int index;
    int array[ARRAY_SIZE] = {4, 3, 2, 5, 6, 7, 8, 9, 12, 1};

    for(index = ARRAY_SIZE - 1; index >= 0; index--)
    {
        printf("myArray[%d] == %d\n",index,myArray[index]);
    }
    return 0;
}

いくつかのヘルパー定数を追加することもできます:

#define ARRAY_FIRST    0
#define ARRAY_LAST     (ARRAY_SIZE -1)
于 2015-03-30T18:01:25.020 に答える