Implementación en C del montón de sesgo

Estoy intentando implementar un montón de sesgo en C, pero mi código no se comstack. No tengo tanta experiencia en C y nunca he creado ningún tipo de stack en C. Por eso no sé cómo solucionarlo, espero que alguien pueda señalarme la dirección correcta. He estado leyendo artículos sobre el montón de sesgo y esto es lo que obtuve utilizando los algoritmos que he encontrado en línea. Gracias por adelantado.

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  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; } } 

Estos son los errores de comstackción que estoy recibiendo en este momento:

 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 

Respecto a los compiler errors,

 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 

le dice que no hay ningún prototipo de skewHeapMerge en el que se skewHeapAdd definido skewHeapAdd , por lo tanto (el comstackdor aparentemente opera en modo C89, pero afortunadamente advierte al respecto), el comstackdor supone una statement implícita con el tipo de retorno int para skewHeapMerge .

Agregue un archivo de encabezado con prototipos para todas sus funciones y #include que en todos los archivos *.c donde se usan o definen estas funciones, para que el comstackdor conozca los tipos de funciones.

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

esa debería ser la línea

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

donde sk->root es un struct node* , pero debido a la statement implícita de skewHeapMerge , se supone que devuelve un int .

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

aquí el comstackdor encuentra que la definición de skewHeapMerge da un tipo en conflicto con el de la statement implícita.

 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 

Eso es por las lineas

 if (left == NULL) return *right; if (right == NULL) return *left; 

Donde deberías volver right a la right . left lugar de *right resp. *left (pasé por alto que al principio).


Tienes un error en skewHeapRemoveFirst

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

donde usas n despues de free d. Tienes que intercambiar las dos últimas líneas en esa función.

Y en 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; 

Estás perdiendo la memoria. Elimine la asignación, ya que si se usa temp , asigne ya sea left->leftchild o right->rightchild a ella.