《数据结构与算法分析——c语言描述》 练习6.32 答案
避免merge(H,H)
H2中没有树留下且Carry树为NULL,修改merge例程以终止合并
修改merge使得较少的树总被合并到较大的树中
binomialqueue.h
#ifndef _BinomialQueue_H
#define _BinomialQueue_H
typedef int ElementType;
struct BinNode;
typedef struct BinNode *BinTree;
typedef struct Collection *BinQueue;
BinQueue initialize(void);
ElementType findMin(BinQueue h);
int isEmpty(BinQueue h);
BinQueue merge(BinQueue &h1, BinQueue &h2);
void insert(ElementType X, BinQueue h);
BinQueue deleteMin(BinQueue h);
#endif // !_BinHeap_H
binomialqueue.cpp
#include"binomialqueue.h"
#include"fatal.h"
#define MAXTREES 25
#define CAPACITY ((1<<MAXTREES)-1)//容量是2^0+2^1+2^3+2^(MAXTREES-1)
typedef struct BinNode *Position;
struct BinNode {
ElementType element;
Position leftChild;
Position nextSibling;
};
struct Collection {
int currentSize;
BinTree theTrees[MAXTREES];
};
BinQueue initialize(void) {
BinQueue h = (BinQueue)malloc(sizeof(struct Collection));
if (h == NULL)
Error("OUT OF MEMORY");
for (int i = 0; i < MAXTREES; i++)
h->theTrees[i] = NULL;
h->currentSize = 0;
return h;
}
ElementType findMin(BinQueue h) {
if (isEmpty(h))
Error("