二项队列 C语言

来源:互联网 发布:淘宝手机详情搭配套餐 编辑:程序博客网 时间:2024/04/30 02:06

实现了二项队列的基本功能,参考书籍 数据结构与算法分析 C描述

头文件

#ifndef _BINQUEUE_H#define _BINQUEUE_Hstruct 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);#endifstruct 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-1BinQueue 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;}


0 0
原创粉丝点击