亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? bplustree.c

?? b+tree 的插入和查詢操作
?? C
字號:
/**************       Bplustree.c      *****************/
/*  To Compile      gcc -o  Bplustree  Bplustree.c     */  
/*  To Run          Bplustree  <input                  */
/*******************************************************/
 
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>

#ifndef _BTREE_

#ifdef __cplusplus
extern "C" {
#endif

int OpenIndex(char *Name, int DupKeys);
/* open or create index file, find free entry in index table,
    fill in entry, DupKeys is 1 if duplicate keys are allowed, 0 if not,
    return number of entry in table */

void CloseIndex(int Index);
/* close Index file, free entry in index info table */

int Insert(int Index, long Key, long Ptr);
/* insert Key & Ptr in index file, return 0 for success, nonzero for error */

long Lookup(int Index, long Key);
/* return pointer for entry in Index file <= Key, return -1 if none */


#ifdef __cplusplus
}
#endif

#endif

#define ORDER 64   
#define BLKSIZE (ORDER*8)
#define BKTPTRS (ORDER*2 - 1)
#define NLEN 40
#define NIDX 20
#define SEEK_SET  0   

typedef struct {
	short LeafNode;
	short KeyCount;
	long Keys[ORDER - 1];
	long Ptrs[ORDER];
} NodeType;

typedef struct {
	long RootBlock;
	long AllocBlock;
	char Junk[BLKSIZE - 2*sizeof(long)];
} HeadType;

typedef struct {
	long Pointers[BKTPTRS];
	long NextBucket;
} BucketType;

typedef struct {
	int Used;
	int File;
	char Name[NLEN];
	int DupKeys;
	long RootBlk;
	long AllocBlk;
	long CurBlk;
	short CurKey;
	short CurPtr;
} IdxInfo;
#define File(Idx)	(IdxTab[Idx].File)
#define Root(Idx)	(IdxTab[Idx].RootBlk)
#define Used(Idx)	(IdxTab[Idx].Used)
#define Dups(Idx)	(IdxTab[Idx].DupKeys)
#define Alloc(Idx)	(IdxTab[Idx].AllocBlk)
#define CBlk(Idx)	(IdxTab[Idx].CurBlk)
#define CKey(Idx)	(IdxTab[Idx].CurKey)
#define CPtr(Idx)	(IdxTab[Idx].CurPtr)

BucketType Bucket;  

static IdxInfo IdxTab[NIDX];

static void ReadBlock(int File, long Block, int Size, void *Addr) {
/*    
printf("ReadBlock(File %d, Block %ld, Size %d, Addr %x)\n",
File, Block, Size, Addr);
*/  

	if(lseek(File, Block * Size, SEEK_SET) == -1 ||
	   read(File, Addr, Size) == -1)
		printf("ReadBlock Error, File %d, Block %d, Size %d\n",
			File, Block, Size);
}

static void WriteBlock(int File, long Block, int Size, void *Addr) {
/* 
printf("WriteBlock(File %d, Block %ld, Size %d, Addr %x)\n",
File, Block, Size, Addr);
*/ 
	if(lseek(File, Block * Size, SEEK_SET) == -1 ||
	   write(File, Addr, Size) == -1)
		printf("WriteBlock Error, File %d, Block %d, Size %d\n",
			File, Block, Size);
}

static void ReadHead(int Index) {
	HeadType HeadBlock;
	ReadBlock(File(Index), 0, BLKSIZE, &HeadBlock);
	Root(Index) = HeadBlock.RootBlock;
	Alloc(Index) = HeadBlock.AllocBlock;
}

static void WriteHead(int Index) {
	HeadType HeadBlock;
        int i;
	HeadBlock.RootBlock = Root(Index);
	HeadBlock.AllocBlock = Alloc(Index);
	WriteBlock(File(Index), 0, BLKSIZE, &HeadBlock);
}

int OpenIndex(char *Name, int DupKeys) {
	int i;
	int j;
	for(i = 0; i < NIDX; i++)
		if(!Used(i)) break;
	Used(i) = 1;
	strcpy(IdxTab[i].Name, Name);
	Dups(i) = DupKeys;
	CBlk(i) = -1;
	if((File(i) = open(Name, O_RDWR)) >= 0) {
		ReadHead(i);
	} else
/*	if((File(i) = creat(Name, S_IREAD|S_IWRITE)) >= 0) {    */ 
        if((File(i) = open(Name, O_RDWR|O_CREAT, 0644)) >= 0) { 
		NodeType Node;
		Root(i) = 1;
		Alloc(i) = 2;
		WriteHead(i);
		Node.LeafNode = 1;
		Node.KeyCount = 0;
	        for(j = 0; j < ORDER-1; j++)
                  { 
                    Node.Ptrs[j] = -1; 
                    Node.Keys[j] = 0; 
                   }  
		Node.Ptrs[ORDER - 1] = -1;
		WriteBlock(File(i), 1, BLKSIZE, &Node);
	} else {
		perror("OpenIndex");
		Used(i) = 0;
		i = -1;
	}
	return i;
}

void CloseIndex(int Index) {
	WriteHead(Index);
	close(File(Index));
	Used(Index) = 0;
}

static int FindKey(NodeType *Node, long Key) {
	int k;
	for(k = 0; k < Node->KeyCount; k++)
		if(Node->Keys[k] > Key) break;
	return k;
}

static void CheckBucket(int Index, NodeType *Node, long *Key, long *Ptr) {
	*Ptr = -1;
	if(CBlk(Index) >= 0) {
		long NextPtr;
	*Key = Node->Keys[CKey(Index)-1];
	*Ptr = Node->Ptrs[CKey(Index)];
	if(Dups(Index)) {
/*		BucketType Bucket;   */ 
		ReadBlock(File(Index), *Ptr, BLKSIZE, &Bucket);
		*Ptr = Bucket.Pointers[CPtr(Index)];
		CPtr(Index)++;
		NextPtr = Bucket.Pointers[CPtr(Index)];
	}
	if(!Dups(Index) || NextPtr < 0) {
		CPtr(Index) = 0;
		CKey(Index)++;
		if(CKey(Index) > Node->KeyCount) {
			CBlk(Index) = Node->Ptrs[0];
			CKey(Index) = 1;
		}
	}
/*     
printf("I%d K%ld P%ld\n", Index, *Key, *Ptr);
*/  
	}
}

long Lookup(int Index, long Key) {
	NodeType Node;
	long Ptr;
	CBlk(Index) = Root(Index);
	for(;;) {
		ReadBlock(File(Index), CBlk(Index), BLKSIZE, &Node);
		CKey(Index) = FindKey(&Node, Key);
		if(Node.LeafNode) break;
		CBlk(Index) = Node.Ptrs[CKey(Index)];
	}
	CPtr(Index) = 0;
	if(CKey(Index) == 0) CBlk(Index) = -1;
	CheckBucket(Index, &Node, &Key, &Ptr);
	return Ptr;
}



static int InsertKey(int Index, NodeType *Node, int KIdx, long *Key, long *Ptr) {
	long Keys[ORDER], Ptrs[ORDER+1];
	int Count, Count1, Count2, k;
	Count = Node->KeyCount + 1;
	Count1 = Count < ORDER ? Count : ORDER/2;
	Count2 = Count - Count1;
	for(k = ORDER/2; k < KIdx; k++) {
		Keys[k] = Node->Keys[k];
		Ptrs[k+1] = Node->Ptrs[k+1];
	}
	Keys[KIdx] = *Key;
	Ptrs[KIdx+1] = *Ptr;
	for(k = KIdx; k < Node->KeyCount; k++) {
		Keys[k+1] = Node->Keys[k];
		Ptrs[k+2] = Node->Ptrs[k+1];
	}
	for(k = KIdx; k < Count1; k++) {
		Node->Keys[k] = Keys[k];
		Node->Ptrs[k+1] = Ptrs[k+1];
	}
	Node->KeyCount = Count1;
	if(Count2) {
		int s, d;
		NodeType NNode;
		NNode.LeafNode = Node->LeafNode;
		Count2 -= !Node->LeafNode;
		for(s = ORDER/2 + !Node->LeafNode, d = 0; d < Count2; s++, d++) {
			NNode.Keys[d] = Keys[s];
			NNode.Ptrs[d] = Ptrs[s];
		}
		NNode.Ptrs[d] = Ptrs[s];
		NNode.KeyCount = Count2;
		*Key = Keys[ORDER/2];
		*Ptr = Alloc(Index)++;
		if(Node->LeafNode) {  /* insert in sequential linked list */
			NNode.Ptrs[0] = Node->Ptrs[0];
			Node->Ptrs[0] = *Ptr;
		}
		WriteBlock(File(Index), *Ptr, BLKSIZE, &NNode);
		WriteHead(Index);
	}
	return Count2;
}

static long NewBucket(int Index, long Ptr, long Next) {
	long BBlk;
        int j; 
	BucketType Bucket;
	Bucket.Pointers[0] = Ptr;
        Bucket.Pointers[1] = -1;  
	Bucket.NextBucket = Next;
	BBlk = Alloc(Index)++;
	WriteBlock(File(Index), BBlk, BLKSIZE, &Bucket);
	WriteHead(Index);
	return BBlk;
}

static int Error;

static int RecInsert(int Index, long Block, long *Key, long *Ptr) {
	NodeType Node;
	int KIdx, Split = 0;
	int EqualKey;
	ReadBlock(File(Index), Block, BLKSIZE, &Node);
	KIdx = FindKey(&Node, *Key);
	EqualKey = KIdx && Node.Keys[KIdx-1] == *Key;
	if(!Node.LeafNode)
		Split = RecInsert(Index, Node.Ptrs[KIdx], Key, Ptr);
	if(Split || Node.LeafNode && !EqualKey) {
		if(Node.LeafNode && Dups(Index))
			*Ptr = NewBucket(Index, *Ptr, -1);
		Split = InsertKey(Index, &Node, KIdx, Key, Ptr);
		WriteBlock(File(Index), Block, BLKSIZE, &Node);
	} else if(Node.LeafNode && Dups(Index)) { /* put in existing bucket */
		BucketType Bucket;
		int i;
		ReadBlock(File(Index), Node.Ptrs[KIdx], BLKSIZE, &Bucket);
		for(i = 0; i < BKTPTRS && Bucket.Pointers[i] >= 0; i++);
		if(i < BKTPTRS) {
		    Bucket.Pointers[i] = *Ptr;
		    if(i < BKTPTRS-1) Bucket.Pointers[i+1] = -1;
		    WriteBlock(File(Index), Node.Ptrs[KIdx], BLKSIZE, &Bucket);
		} else {
			printf("ERROR: Bucket Overflow\n");
		}
	} else if(Node.LeafNode) {
		Error = -1;
	}
	return Split;
}

int Insert(int Index, long Key, long Ptr) {
	int Split;
	Error = 0;
	Split = RecInsert(Index, Root(Index), &Key, &Ptr);
	if(Split) {
		NodeType Node;
		Node.LeafNode = 0;
		Node.KeyCount = 1;
		Node.Keys[0] = Key;
		Node.Ptrs[1] = Ptr;
		Node.Ptrs[0] = Root(Index);
		Root(Index) = Alloc(Index)++;
		WriteBlock(File(Index), Root(Index), BLKSIZE, &Node);
		WriteHead(Index);
	}
	CBlk(Index) = -1;
	return Error;
}

main()  {

/********************************************************************/
/* The main section of code should be replaced.                     */ 
/* It just illustrates how keys and addresses can be inserted       */   
/* into a B+ tree and then retrieved                                */   
/********************************************************************/

 char Xname[8];
  int  Xdupkeys; 
  int  XEntryNum; 
  long XKey, XPtr;    
  int  RetnCode;     
  int  i,j;     

  int NumInsert, NumLookup;  

  printf("start main\n");  

  Xdupkeys  = 0;  
  Xname[0]  = 'm'; 
  Xname[1]  = 'y'; 
  Xname[2]  = 'f'; 
  Xname[3]  = 'i'; 
  Xname[4]  = 'l'; 
  Xname[5]  = 'e'; 
  

/********************************************************************/  
/* read number of keys to insert, the number of keys  to search for */ 
/* and whether duplicates are allowed in the index                  */ 
/********************************************************************/  

  scanf("%d  %d  %d",&NumInsert, &NumLookup, &Xdupkeys);

  XEntryNum = OpenIndex(Xname, Xdupkeys);  

  for(i = 0; i < NumInsert; i++)
     {  

/* read key and address  to insert into the B+ tree  */ 

       scanf("%d  %d",&XKey, &XPtr);
       printf("%d  %d",XKey, XPtr);
       printf("\n");

       RetnCode = Insert(XEntryNum, XKey, XPtr);        
       if (RetnCode != 0)  
          printf("Error During Key Insertion\n");         
     }  


 for(i = 0; i < NumLookup; i++)
     {  

/* read key to lookup in the B+ tree  */ 

       scanf("%d",&XKey);
       printf("%d",XKey);
       printf("\n");
       XPtr = Lookup(XEntryNum, XKey);   
       if (Xdupkeys == 0)  {  
         printf("Key value is %d and Ptr value is %d\n", XKey, XPtr);    
        } 
       else 
         printf("Key value is %d\n", XKey);  

       if (Xdupkeys == 1) { 
         j = 0;  
         while (Bucket.Pointers[j] != -1)  { 
            printf("Ptr value is %d\n", Bucket.Pointers[j]); 
            j++; 
           } 
       }    
     }  


  CloseIndex(XEntryNum);

  printf("finish main\n");  


} 

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人sese在线| 精品国产精品网麻豆系列| 欧美人牲a欧美精品| 久久精品视频网| 亚洲国产成人av好男人在线观看| 久久电影网电视剧免费观看| 色94色欧美sute亚洲线路一ni| 日韩欧美一区二区视频| 国产精品不卡在线| 久久综合综合久久综合| 欧美在线你懂得| 国产精品拍天天在线| 免费三级欧美电影| 欧美在线观看18| 亚洲视频免费观看| 国产成人精品免费一区二区| 国产女人水真多18毛片18精品视频| 成人免费小视频| 国产精品 日产精品 欧美精品| 在线播放亚洲一区| 夜夜嗨av一区二区三区四季av| 国产ts人妖一区二区| 欧美大尺度电影在线| 日韩av电影天堂| 欧美精品粉嫩高潮一区二区| 一区二区三区中文在线观看| 成人黄色免费短视频| 国产亚洲综合av| 国产精品亚洲午夜一区二区三区 | 欧美日韩在线播放一区| 1000部国产精品成人观看| 高清不卡一区二区| 久久久久国产免费免费| 国产在线不卡一区| 久久久久久97三级| 国产精品自拍毛片| 日本一区二区免费在线观看视频| 国产一区高清在线| 欧美激情一区二区三区| 岛国av在线一区| 国产精品视频看| 99久久er热在这里只有精品66| 成人欧美一区二区三区黑人麻豆| 99精品偷自拍| 一区二区三区中文字幕在线观看| 欧洲日韩一区二区三区| 丝袜a∨在线一区二区三区不卡| 欧美精品日韩综合在线| 免费在线一区观看| 国产日韩欧美综合在线| 成人va在线观看| 亚洲综合激情另类小说区| 欧美日韩精品二区第二页| 日韩电影免费在线| 久久天堂av综合合色蜜桃网| 成人黄色免费短视频| 一级精品视频在线观看宜春院| 精品1区2区3区| 精品在线观看免费| 日韩一区欧美一区| 91精品国产麻豆国产自产在线| 国产一区二区三区美女| 亚洲欧美色综合| 欧美一区二区成人| 成年人网站91| 日韩电影一区二区三区四区| 久久免费视频色| 91免费国产视频网站| 奇米一区二区三区av| 国产欧美日韩在线观看| 欧美影视一区二区三区| 久久国产精品99久久久久久老狼| 国产精品你懂的在线欣赏| 欧美日韩国产首页| 国产成人亚洲综合a∨猫咪| 亚洲午夜三级在线| 国产肉丝袜一区二区| 在线不卡的av| 91亚洲国产成人精品一区二三| 免费久久99精品国产| 亚洲人成电影网站色mp4| 日韩免费视频一区二区| 欧美在线你懂得| zzijzzij亚洲日本少妇熟睡| 日韩成人伦理电影在线观看| 亚洲色图20p| 中文字幕精品—区二区四季| 91精品免费在线| 在线观看国产精品网站| 成人免费毛片高清视频| 久久99精品久久久久久国产越南 | 福利一区二区在线| 美国欧美日韩国产在线播放| 亚洲精品国产高清久久伦理二区| 亚洲精品一线二线三线无人区| 色国产精品一区在线观看| 国产成人综合精品三级| 奇米色一区二区三区四区| 一区二区高清在线| 国产精品久久毛片a| 久久久国产一区二区三区四区小说 | 精品999在线播放| 91超碰这里只有精品国产| 91麻豆国产福利在线观看| 丰满少妇久久久久久久| 国产精品小仙女| 国内精品写真在线观看| 黄页网站大全一区二区| 老司机精品视频在线| 蜜桃视频一区二区| 奇米精品一区二区三区四区| 亚洲午夜av在线| 亚洲风情在线资源站| 亚洲午夜日本在线观看| 亚洲成人一区在线| 亚洲成人久久影院| 天天操天天干天天综合网| 亚洲国产视频一区| 亚洲国产欧美在线| 午夜视频在线观看一区| 亚洲6080在线| 国产高清成人在线| 成人一区二区视频| 成人app网站| 一本色道综合亚洲| 欧美在线观看视频在线| 5566中文字幕一区二区电影| 欧美二区三区的天堂| 欧美一级高清片在线观看| 欧美大片拔萝卜| 国产欧美日本一区视频| 国产精品传媒在线| 亚洲国产cao| 捆绑调教一区二区三区| 国产老肥熟一区二区三区| 成人永久aaa| 欧美色国产精品| 精品裸体舞一区二区三区| 久久亚洲精精品中文字幕早川悠里 | 欧美午夜一区二区三区免费大片| 欧美日韩午夜在线视频| 欧美大肚乱孕交hd孕妇| 国产喷白浆一区二区三区| 综合亚洲深深色噜噜狠狠网站| 一区二区三区免费| 美国三级日本三级久久99| 成人免费看片app下载| 欧美亚洲日本一区| 精品成人一区二区三区四区| 国产精品免费网站在线观看| 亚洲成人精品在线观看| 国产一区二区三区精品欧美日韩一区二区三区| 成人精品亚洲人成在线| 欧美日韩中文另类| 国产亚洲美州欧州综合国 | 91精品国产福利| 国产女主播一区| 图片区小说区国产精品视频| 久久精品99国产精品日本| 91色porny| 精品国产制服丝袜高跟| 亚洲精品日产精品乱码不卡| 久久不见久久见免费视频1| 色综合天天天天做夜夜夜夜做| 欧美激情在线免费观看| 一区二区高清视频在线观看| 捆绑调教一区二区三区| 一本到一区二区三区| 精品捆绑美女sm三区| 亚洲一区在线观看网站| 丁香婷婷综合五月| 日韩视频免费直播| 亚洲小少妇裸体bbw| 成人av午夜影院| 精品久久人人做人人爰| 亚洲第一成年网| 91无套直看片红桃| 日本一区二区三区电影| 激情深爱一区二区| 91精品国产91久久久久久一区二区| 一区在线中文字幕| 国产精品一二三在| 精品国产乱码久久久久久免费| 亚洲电影在线免费观看| 色婷婷综合久久久中文字幕| 国产精品麻豆久久久| 国产麻豆午夜三级精品| 精品国产一二三区| 蜜桃av一区二区在线观看| 欧美日韩国产小视频| 亚洲一区二区美女| 欧洲视频一区二区| 一区二区三区免费| 91亚洲国产成人精品一区二三 | 欧美人牲a欧美精品| 一区二区三区欧美日韩| 91国在线观看| 亚洲一区二区三区四区的| 91视频com| 一区二区三区av电影 |