二项队列 C语言
2017-04-11 14:03
316 查看
实现了二项队列的基本功能,参考书籍 数据结构与算法分析 C描述
头文件
#ifndef _BINQUEUE_H
#define _BINQUEUE_H
struct Binnode;
struct Collection;
typedef struct Collection *BinQueue;
typedef struct Binnode *BinTree;
typedef int Item;
typedef struct Binnode *Position;
BinQueue initial(void);
int isEmpty(BinQueue Q);
static BinTree combineTree(BinTree b1,BinTree b2);
static BinTree make_tree(Item it);
BinQueue merge(BinQueue Q1,BinQueue Q2);
BinQueue insert(Item it,BinQueue Q);
Item deleteMin(BinQueue Q);
#endif
struct Binnode{
Item item;
Position leftChild;
Position nextBro;
};
struct Collection{
int size;
BinTree *forest;
};
实现源文件
#include"binqueue.h"
#include<stdlib.h>
#include<stdio.h>
int main(){
BinQueue Q=initial();
if(isEmpty(Q))
printf("this binqueue empty\n");
insert(8,Q);
printf("%d\n",Q->size);
insert(18,Q);
insert(28,Q);
insert(84,Q);
insert(62,Q);
insert(218,Q);
printf("%d\n",Q->size);
Item it=deleteMin(Q);
printf("%d\t",it);
printf("%d\n",Q->size);
BinQueue Q1=initial();
insert(99,Q);
insert(21,Q);
insert(845,Q);
merge(Q,Q1);
printf("%d\t",it);
printf("%d\n",Q->size);
return 0;
}
头文件
#ifndef _BINQUEUE_H
#define _BINQUEUE_H
struct Binnode;
struct Collection;
typedef struct Collection *BinQueue;
typedef struct Binnode *BinTree;
typedef int Item;
typedef struct Binnode *Position;
BinQueue initial(void);
int isEmpty(BinQueue Q);
static BinTree combineTree(BinTree b1,BinTree b2);
static BinTree make_tree(Item it);
BinQueue merge(BinQueue Q1,BinQueue Q2);
BinQueue insert(Item it,BinQueue Q);
Item deleteMin(BinQueue Q);
#endif
struct Binnode{
Item item;
Position leftChild;
Position nextBro;
};
struct Collection{
int size;
BinTree *forest;
};
实现源文件
#include"binqueue.h" #include<stdio.h> #include<stdlib.h> #define TREESIZE 20 #define NODESIZE 2<<20-1 BinQueue initial(){ BinQueue Q; Q=(BinQueue)malloc(sizeof(struct Collection)); if(Q==NULL){ puts("arrange collection fail"); exit(1); } Q->forest=(BinTree *)malloc(sizeof(BinTree)*TREESIZE); if(Q->forest==NULL){ puts("forset arrange fail"); free(Q); exit(1); } int i; for(i=0;i<TREESIZE;i++) Q->forest[i]=NULL; Q->size=0; return Q; } int isEmpty(BinQueue Q){ return Q->size==0; } static BinTree combineTree(BinTree b1,BinTree b2){ if(b1->item > b2->item) return combineTree(b2,b1); b2->nextBro=b1->leftChild; b1->leftChild=b2; return b1; } static BinTree makeTree(Item item){ BinTree tree; tree=(BinTree)malloc(sizeof(struct Binnode)); if(tree==NULL){ puts("arrange tree fail"); exit(1); } tree->leftChild=tree->nextBro=NULL; tree->item=item; return tree; } BinQueue merge(BinQueue Q1,BinQueue Q2){ if(Q1->size + Q2->size > NODESIZE){ puts("oversize"); exit(1); } Q1->size+=Q2->size; int i,j; BinTree T1,T2,Carry=NULL; for(i=0,j=1;j<=Q1->size;j*=2,i++){ T1=Q1->forest[i]; T2=Q2->forest[i]; switch(!!T1+2*!!T2+4*!!Carry){ case 0: case 1: break; case 2: Q1->forest[i]=T2; Q2->forest[i]=NULL; break; case 3: Q1->forest[i]=Q2->forest[i]=NULL; Carry=combineTree(T1,T2); break; case 4: Q1->forest[i]=Carry; Carry=NULL; break; case 5: Carry=combineTree(T1,Carry); Q1->forest[i]=NULL; break; case 6: Carry=combineTree(T2,Carry); Q2->forest[i]=NULL; break; case 7: Q1->forest[i]=Carry; Carry=combineTree(T2,T1); Q2->forest[i]=NULL; break; } } return Q1; } BinQueue insert(Item it,BinQueue Q){ BinQueue Q1; Q1=initial(); BinTree tree; tree=makeTree(it); Q1->forest[0]=tree; Q1->size++; Q=merge(Q,Q1); return Q; } Item deleteMin(BinQueue Q){ if(isEmpty(Q)){ puts("empty bin_queue"); exit(1); } BinQueue deletedQueue; Position old,deletedTree; Item it=32767; int i,j,min; for(i=0;i<TREESIZE;i++){ if(Q->forest[i]!=NULL && Q->forest[i]->item < it) { min=i; it=Q->forest[i]->item; } } //已找到最小值 old=Q->forest[min]; deletedQueue=initial(); deletedQueue->size=(1<<min)-1; deletedTree=old->leftChild; free(old); for(j=min-1;j>=0;j--){ deletedQueue->forest[j]=deletedTree; deletedTree=deletedTree->nextBro; deletedQueue->forest[j]->nextBro=NULL; //有一个队列造好了 } Q->forest[min]=NULL; Q->size=Q->size-deletedQueue->size-1; merge(Q,deletedQueue); return it; }测试例程
#include"binqueue.h"
#include<stdlib.h>
#include<stdio.h>
int main(){
BinQueue Q=initial();
if(isEmpty(Q))
printf("this binqueue empty\n");
insert(8,Q);
printf("%d\n",Q->size);
insert(18,Q);
insert(28,Q);
insert(84,Q);
insert(62,Q);
insert(218,Q);
printf("%d\n",Q->size);
Item it=deleteMin(Q);
printf("%d\t",it);
printf("%d\n",Q->size);
BinQueue Q1=initial();
insert(99,Q);
insert(21,Q);
insert(845,Q);
merge(Q,Q1);
printf("%d\t",it);
printf("%d\n",Q->size);
return 0;
}
相关文章推荐