-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBPlusTree.h
153 lines (126 loc) · 3.76 KB
/
BPlusTree.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#ifndef _B_PLUS_TREE_H
#define _B_PLUS_TREE_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<limits.h>
#include<time.h>
#define DEGREE 8
#define DEGREE_2 (DEGREE * 2)
#define true 1
#define false 0
#define STRINGLENGTH 32
#define LEAF_LENGTH 4
#define NUM_LENGTH 4
#define KEY_LENGTH 4
typedef struct BPlusTreeNode *PBTreeNode;
typedef struct BPlusTree *BPTree;
typedef int KEYTYPE;
typedef struct MyData DATATYPE;
typedef struct RangeData RangeDataes;
struct MyData
{
char idcard[STRINGLENGTH]; /* 自定义的卫星数据结构 */
};
struct BPlusTreeNode
{
int leaf; /* 标识是否为叶子结点 */
int num; /* 结点中键值或孩子或数据的数目 */
KEYTYPE key[DEGREE_2];
PBTreeNode children[DEGREE_2]; /* 叶子节点中,children无效 */
PBTreeNode next; /* 在叶子结点中有效,指向下一个叶子结点 */
DATATYPE *data[DEGREE_2]; /* 只有在叶节点中,data才有效; 如果是非叶节点,且data有效,说明这是根节点(只有一层) */
};
struct BPlusTree
{
int total_key_num; /* 整个b+树中键值或数据的数目 */
PBTreeNode root; /* 指向b+树的根结点 */
PBTreeNode first; /* 指向b+树的第一个叶子结点 */
};
struct RangeData
{
DATATYPE *data; /* 指向范围查询得到的数据集合 */
KEYTYPE *key; /* 指向范围查询得到的键值集合 */
int num; /* 数据或键值集合的数目 */
};
/* b+树初始化 */
extern BPTree initialize();
/*
**功能:查找数据
**输入:b+树指针,键值
**返回:指向查找键值对应数据的指针
*/
extern DATATYPE* search(BPTree T, KEYTYPE key);
/*
**功能:更新数据
**输入:b+树指针,键值,键值对应的需要更新的数据
**返回:b+树指针
*/
extern BPTree update(BPTree T, KEYTYPE KEY, DATATYPE const *newData);
/*
**功能:插入键值及数据
**输入:b+树指针,要插入的键值,插入键值对应的数据
**返回:b+树指针
*/
extern BPTree insert(BPTree T, KEYTYPE key, DATATYPE const *data);
/*
**功能:删除键值及对应的数据
**输入:b+树指针,键值
**返回:b+树指针
*/
extern BPTree removeKey(BPTree T, KEYTYPE key);
/*
**功能:查询键值在[begin,end]范围内,对应的<键值,数据>的集合
**输入:b+树指针,下限键值,上限键值
**返回:指向所查询的<键值,数据>集合的指针
*/
extern RangeDataes* searchRange(BPTree T, KEYTYPE begin, KEYTYPE end);
/*
**功能:销毁b+树,释放空间
**输入:b+树指针
**返回:若b+树销毁成功,返回空指针。
*/
extern BPTree destroy(BPTree T);
extern void destroyRangedata(RangeDataes *data);
/*
**功能:遍历b+树键值
**输入:b+树指针
**返回:指向键值集合的指针
*/
extern KEYTYPE* travel(BPTree T);
/*
**功能:遍历b+树键值前N个
**输入:b+树指针
**返回:指向N个键值集合的指针
*/
extern KEYTYPE* travelN(BPTree T,int count);
/*
**功能:遍历b+树卫星数据
**输入:b+树指针
**返回:指向卫星数据集合的指针
*/
extern DATATYPE* travelData(BPTree T);
/*
**功能:遍历b+树卫星数据前N个
**输入:b+树指针
**返回:指向N个卫星数据集合的指针
*/
extern DATATYPE* travelDataN(BPTree T,int count);
extern void showRange(RangeDataes const *dataes);
extern void showBPlusTree(BPTree T);
/*
**功能:序列化b+树到文件
**输入:文件路径,b+树指针
**返回:整型,1标识成功,0标识失败
*/
extern int serialize(const char *filePath, BPTree tree);
/*
**功能:反序列化文件到b+树
**输入:文件路径
**返回:序列化成功的b+树,失败返回NULL
*/
extern BPTree deserialize(const char *filePath);
#endif /* BPlusTree.h */