2012-11-12 3 views
1

C에서 스큐 힙을 구현하려고하지만 코드가 컴파일되지 않습니다. 나는 C에서 경험이 없으며 C에서 어떤 유형의 힙도 만들지 않았습니다. 그래서 나는 그것을 고치는 법을 모르며 누군가 제가 올바른 방향을 가리킬 수 있기를 바랍니다. 저는 skew heap에 대한 기사를 읽었습니다. 그리고 이것은 제가 지금까지 찾은 알고리즘을 사용하여 얻은 것입니다. 미리 감사드립니다.C 스큐 힙 구현

program.c: In function ‘skewHeapAdd’: 
program.c:185: warning: implicit declaration of function ‘skewHeapMerge’ 
program.c:185: warning: assignment makes pointer from integer without a cast 

skewHeapMerge의 더 프로토 타입의 범위가 어디에서 없다 있음을 알려줍니다, 컴파일러 오류에 관한

program.c: In function ‘skewHeapAdd’: 
program.c:185: warning: implicit declaration of function ‘skewHeapMerge’ 
program.c:185: warning: assignment makes pointer from integer without a cast 
program.c: In function ‘skewHeapRemoveFirst’: 
program.c:191: warning: assignment makes pointer from integer without a cast 
program.c: At top level: 
program.c:196: error: conflicting types for ‘skewHeapMerge’ 
program.c:185: note: previous implicit declaration of ‘skewHeapMerge’ was here 
program.c: In function ‘skewHeapMerge’: 
program.c:202: error: incompatible types when returning type ‘struct node’ but ‘struct node *’ was expected 
program.c:205: error: incompatible types when returning type ‘struct node’ but ‘struct node *’ was expected 
+2

컴파일 오류 란 무엇입니까? –

+1

전체 프로그램을 작성한 다음 컴파일되고 압도당한 것처럼 보입니다. 약간의 코드를 작성하고 컴파일하는 습관을 갖도록 노력하십시오. 이것을 컴파일러 오류 메시지가 말하는 것을 읽는 것과 결합하십시오. 혼란스러운 다른 오류 메시지가 발생할 수 있으므로 항상 * first * 오류 메시지로 시작해야합니다. – paddy

+0

그 혼란의 비트! 당신은 당신의 병합에서 메모리를 물러나게 될 것이고, 당신의 임시 직원은 메모리를 할당받을 필요가 없습니다. 당신은 단지 그것을 기존의 메모리를 가리 키기 위해 사용하고 있습니다. 당신은 "노드"의 정의를 보여주지 않았다 –

답변

1

:

typedef struct node 
{ 
int value; 
struct node * root; 
struct node * leftchild; 
struct node * rightchild; 
} Node; 

struct skewHeap 
{ 
    struct node * root; 
}; 

void skewHeapInit (struct skewHeap * sk) 
{ 
    sk->root = 0; 
} 

void skewHeapAdd (struct skewHeap *sk) 
{ 
    struct node *n = (struct node *) malloc(sizeof(struct node)); 
    assert(n != 0); 
    n->value = 0; 
    n->leftchild = 0; 
    n->rightchild = 0; 
    line 185. s->root = skewHeapMerge(s->root, n); 
} 

void skewHeapRemoveFirst (struct skewHeap *sk) 
{ 
    struct node * n = sk->root; 
    free(n); 
    sk->root = skewHeapMerge(n->leftchild, n->rightchild); 
} 

line 196. struct node * skewHeapMerge(struct node *left, struct node *right) 
{ 
    struct node *temp = (struct node *) malloc(sizeof(struct node)); 

    if (left == NULL) 
     return *right; 

    if (right == NULL) 
     return *left; 

    if (left->value < right-> value) 
    { 
     temp = left->leftchild; 
     left->leftchild = skewHeapMerge(left->rightchild, right); 
     left->rightchild = temp; 
     return left; 
    } 
    else 
    { 
     temp = right->rightchild; 
     right->rightchild = skewHeapMerge(right->leftchild, left); 
     right->leftchild = temp; 
     return right; 
    } 
} 

내가 지금 받고있어 컴파일 에러입니다 skewHeapAdd이 정의되어 있으므로 (컴파일러는 분명히 C89 모드로 작동하지만 다행히 경고합니다) 컴파일러는 return t로 암시 적 선언을 가정합니다 ype intskewHeapMerge입니다.

모든 함수에 대한 프로토 타입이 포함 된 헤더 파일과이 함수가 사용되거나 정의 된 *.c 파일에있는 #include 파일을 추가하여 컴파일러에서 함수 유형을 알고 있어야합니다. 광고 sk->rootstruct node*이지만 skewHeapMerge 의한 암시 적 선언, 그가 int을 반환 가정

sk->root = skewHeapMerge(n->leftchild, n->rightchild); 

에게 있어야

program.c: In function ‘skewHeapRemoveFirst’: 
program.c:191: warning: assignment makes pointer from integer without a cast 

.

program.c: At top level: 
program.c:196: error: conflicting types for ‘skewHeapMerge’ 
program.c:185: note: previous implicit declaration of ‘skewHeapMerge’ was here 

여기 컴파일러는 skewHeapMerge의 정의는 암시 적 선언에서 하나 충돌 유형을 준다 찾습니다. 라인
if (left == NULL) 
    return *right; 

if (right == NULL) 
    return *left; 

입니다

program.c: In function ‘skewHeapMerge’: 
program.c:202: error: incompatible types when returning type ‘struct node’ but ‘struct node *’ was expected 
program.c:205: error: incompatible types when returning type ‘struct node’ but ‘struct node *’ was expected 

어디 right RESP를 반환해야한다. *right 대신 left을 입력하십시오. *left (나는 처음에 그것을 간과했다). 당신 free D 뒤에 n를 사용하는 경우


당신은 skewHeapRemoveFirst

void skewHeapRemoveFirst (struct skewHeap *sk) 
{ 
    struct node * n = sk->root; 
    free(n); 
    sk->root = skewHeapMerge(n->leftchild, n->rightchild); 
} 

에서 실수 있습니다. 그 함수에서 마지막 두 줄을 교환해야합니다.

그리고 메모리가 누수되는 skewHeapMerge

struct node * skewHeapMerge(struct node *left, struct node *right) 
{ 
    struct node *temp = (struct node *) malloc(sizeof(struct node)); 

    if (left == NULL) 
     return *right; 

    if (right == NULL) 
     return *left; 

에서

. temp이 전혀 사용되지 않는 경우 left->leftchild 또는 right->rightchild을 할당하므로 할당을 제거하십시오.

+0

오류를 지적 해 주셔서 감사합니다. – Brkk

+0

컴파일러 메시지에 대한 토론으로 업데이트되었습니다. –

+0

좋은 설명을 해 주셔서 감사합니다. 오류없이 컴파일 할 수 있습니다. – Brkk