您的位置:首页 > 编程语言 > C语言/C++

二项队列 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<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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: