索引中的B+树在linux下代码中怎么实现

索引中的B+树在linux下代码中怎么实现,第1张

nix系系统:
ES(Unix)
例子: IvS7aeT4NzQPM
说明:Linux或者其他linux内核系统中
长度: 13 个字符
描述:第1、2位为salt,例子中的'Iv'位salt,后面的为hash值
系统:MD5(Unix)
例子:$1$12345678$XM4P3PrKBgKNnTaqG9P0T/
说明:Linux或者其他linux内核系统中
长度:34个字符
描述:开始的$1$位为加密标志,后面8位12345678为加密使用的salt,后面的为hash
加密算法:2000次循环调用MD5加密
系统:SHA-512(Unix)

文件 maincpp 代码如下:
#include<malloch> // malloc()等
#include<stdioh> // 标准输入输出头文件,包括EOF(=^Z或F6),NULL等
#include<stdlibh> // atoi(),exit()
#include<mathh> // 数学函数头文件,包括floor(),ceil(),abs()等
#define ClearBiTree DestroyBiTree // 清空二叉树和销毁二叉树的 *** 作一样
typedef struct BiTNode
{
int data; // 结点的值
BiTNode lchild,rchild; // 左右孩子指针
}BiTNode,BiTree;
int Nil=0; // 设整型以0为空
void visit(int e)
{ printf("%d ",e); // 以整型格式输出
}
void InitBiTree(BiTree &T)
{ // *** 作结果:构造空二叉树T
T=NULL;
}
void CreateBiTree(BiTree &T)
{ // 算法64:按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中定义),
// 构造二叉链表表示的二叉树T。变量Nil表示空(子)树。修改
int number;
scanf("%d",&number); // 输入结点的值
if(number==Nil) // 结点的值为空
T=NULL;
else // 结点的值不为空
{ T=(BiTree)malloc(sizeof(BiTNode)); // 生成根结点
if(!T)
exit(OVERFLOW);
T->data=number; // 将值赋给T所指结点
CreateBiTree(T->lchild); // 递归构造左子树
CreateBiTree(T->rchild); // 递归构造右子树
}
}
void DestroyBiTree(BiTree &T)
{ // 初始条件:二叉树T存在。 *** 作结果:销毁二叉树T
if(T) // 非空树
{ DestroyBiTree(T->lchild); // 递归销毁左子树,如无左子树,则不执行任何 *** 作
DestroyBiTree(T->rchild); // 递归销毁右子树,如无右子树,则不执行任何 *** 作
free(T); // 释放根结点
T=NULL; // 空指针赋0
}
}
void PreOrderTraverse(BiTree T,void(Visit)(int))
{ // 初始条件:二叉树T存在,Visit是对结点 *** 作的应用函数。修改算法61
// *** 作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T) // T不空
{ Visit(T->data); // 先访问根结点
PreOrderTraverse(T->lchild,Visit); // 再先序遍历左子树
PreOrderTraverse(T->rchild,Visit); // 最后先序遍历右子树
}
}
void InOrderTraverse(BiTree T,void(Visit)(int))
{ // 初始条件:二叉树T存在,Visit是对结点 *** 作的应用函数
// *** 作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T)
{ InOrderTraverse(T->lchild,Visit); // 先中序遍历左子树
Visit(T->data); // 再访问根结点
InOrderTraverse(T->rchild,Visit); // 最后中序遍历右子树
}
}
void PostOrderTraverse(BiTree T,void(Visit)(int))
{ // 初始条件:二叉树T存在,Visit是对结点 *** 作的应用函数
// *** 作结果:后序递归遍历T,对每个结点调用函数Visit一次且仅一次
if(T) // T不空
{ PostOrderTraverse(T->lchild,Visit); // 先后序遍历左子树
PostOrderTraverse(T->rchild,Visit); // 再后序遍历右子树
Visit(T->data); // 最后访问根结点
}
}
void main()
{
BiTree T;
InitBiTree(T); // 初始化二叉树T
printf("按先序次序输入二叉树中结点的值,输入0表示节点为空,输入范例:1 2 0 0 3 0 0\n");
CreateBiTree(T); // 建立二叉树T
printf("先序递归遍历二叉树:\n");
PreOrderTraverse(T,visit); // 先序递归遍历二叉树T
printf("\n中序递归遍历二叉树:\n");
InOrderTraverse(T,visit); // 中序递归遍历二叉树T
printf("\n后序递归遍历二叉树:\n");
PostOrderTraverse(T,visit); // 后序递归遍历二叉树T
}

void setup()
{
size(600,600);
background(0);
noFill();
stroke(255,200);
frameRate(1);
}

boolean zmianaK = true;

int ii = 1;

void draw()
{
if(ii < 18)
{ background(1);
dPitagorejskie(100,height/2-50, 55, 025, 04, ii);
ii++;
}
}

void dPitagorejskie(float X, float Y, float D, float wspP, float wspH, int ilRek)
{
pushMatrix();
translate(X,Y);
rectMode(CENTER);
dPitagorejskieR(D, wspP, wspH, ilRek);
rectMode(CORNER);
popMatrix();
}

void dPitagorejskieR(float D, float wspP, float wspH, int ilRek)
{
if(ilRek > 0 && (wspP <= 1))
{
ilRek--;
rect(0,0,D,D);

pushMatrix();
translate(D/2,0);
float H = wspHD;
float rA = wspPD;
float rB = (1-wspP)D;
float A = dist(0, -D/2, H, rA-D/2); //przeciwprostokatna A
float B = dist(0, D/2, H, D/2-rB); //przeciwprostokatna A
float alfa = atan(H/rA);
float beta = atan(H/rB);

translate(H/2, rA/2-D/2);
rotate(-alfa);
translate(A/2, 0);
dPitagorejskieR(A, zmianaK 1-wspP : wspP, wspH, ilRek);
popMatrix();

translate(D/2,D/2);
translate(H/2, -rB/2);
rotate(beta);
translate(B/2, 0);

dPitagorejskieR(B, zmianaK 1-wspP : wspP, wspH, ilRek);

}
}

package tree;

import javautilLinkedList;
import javautilList;

/
功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历

参考资料0:数据结构(C语言版)严蔚敏

参考资料1:>

队列??你每输入一个节点将其存入队列中,再输入它的左孩子,它的左孩子也会入队,我们取的时候应先取该节点的左孩子,

LZ一定要用队列也行,但绝对不是正确的选择!

队列如下:

#include <iostream>
using namespace std;
typedef struct bitnode
{
    char data;
    struct bitnode lchild,rchild;
}bitree,tree;
int number=0;
void createbitree(bitree &t)
{
    char c;
    int i=0,r=0,f=0;//r,f分别指向队首和队尾
    bitree p=NULL,temp=NULL,pre=NULL,s[100];
    s[0]=NULL;
    int lflag[100]={0};
    int rflag[100]={0};
    printf("请输入根节点:");
    t=new tree;
    t->lchild=t->rchild=NULL;
    scanf("%c",&t->data);
    temp=pre=t->lchild;
    s[++i]=t;
    f=i;
    p = t;
    while(f!=r)
    {
        if(p->lchild==NULL&&lflag[i]==0)
        {
            printf("请输入%c的左孩子:",p->data);
            fflush(stdin);
            scanf("%c",&c);
            if(c!='#')
            {
                p->lchild = new tree;
                p = p->lchild;
                p->lchild=p->rchild=NULL;
                p->data = c;
                s[++f]=p;
                i = f;
                lflag[i]=rflag[i]=0;
            }
            else
                lflag[i]=1;
        }
        else if(p->rchild==NULL&&rflag[i]==0)
        {
            printf("请输入%c的右孩子:",p->data);
            fflush(stdin);
            scanf("%c",&c);
            if(c!='#')
            {
                p->rchild = new tree;
                p = p->rchild;
                p->lchild=p->rchild=NULL;
                p->data = c;
                s[++f]=p;
                i=f;
                lflag[i]=rflag[i]=0;
            }
            else
            {
                rflag[i]=1;
                p=s[++r];
                i=r;
            }
        }
        else
        {
            p=s[++r];
            i=r;
        }
    }
}
void preorder(bitree &t)//遍历二叉树,输出函数
{
    if (t!=0)
    {
        cout<<t->data<<",";
        preorder(t->lchild);
        preorder(t->rchild);
    }
}
void main()
{
    bitree t;
    t=0;
    createbitree(t);
    cout<<"the value of the preorder value is:";
    preorder(t);
}

在此,强烈建议LZ用栈,更符合树的输入层次:

#include <iostream>
using namespace std;
typedef struct bitnode
{
    char data;
    struct bitnode lchild,rchild;
}bitree,tree;
int number=0;
void createbitree(bitree &t)
{
    char c;
    int i=0;
    bitree p=NULL,temp=NULL,pre=NULL,s[100];
    s[0]=NULL;
    int lflag[100]={0};
    int rflag[100]={0};
    printf("请输入根节点:");
    t=new tree;
    t->lchild=t->rchild=NULL;
    scanf("%c",&t->data);
    temp=pre=t->lchild;
    s[++i]=t;
    p = t;
    while(s[i]!=NULL)
    {
        if(p->lchild==NULL&&lflag[i]==0)
        {
            printf("请输入%c的左孩子:",p->data);
            fflush(stdin);
            scanf("%c",&c);
            if(c!='#')
            {
                p->lchild = new tree;
                p = p->lchild;
                p->lchild=p->rchild=NULL;
                p->data = c;
                s[++i]=p;
                lflag[i]=rflag[i]=0;
            }
            else
                lflag[i]=1;
        }
        else if(p->rchild==NULL&&rflag[i]==0)
        {
            printf("请输入%c的右孩子:",p->data);
            fflush(stdin);
            scanf("%c",&c);
            if(c!='#')
            {
                p->rchild = new tree;
                p = p->rchild;
                p->lchild=p->rchild=NULL;
                p->data = c;
                s[++i]=p;
                lflag[i]=rflag[i]=0;
            }
            else
            {
                rflag[i]=1;
                p=s[--i];
            }
        }
        else
            p=s[--i];
    }
}
void preorder(bitree &t)//遍历二叉树,输出函数
{
    if (t!=0)
    {
        cout<<t->data<<",";
        preorder(t->lchild);
        preorder(t->rchild);
    }
}
void main()
{
    bitree t;
    t=0;
    createbitree(t);
    cout<<"the value of the preorder value is:";
    preorder(t);
}

不懂追问!你的疑问往往是我要学习的地方!


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/13141269.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-11
下一篇 2023-06-11

发表评论

登录后才能评论

评论列表(0条)

保存