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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? test.c

?? 紅黑樹和二叉查找樹數據結構的實現以及二者的性能比較的C語言實現代碼
?? C
字號:
// red-black tree

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

//////////////////////
// supplied by user //
//////////////////////

typedef int KeyType;            // type of key

typedef struct {                // value related to key
    int stuff;
} ValType;

// how to compare keys
#define compLT(a,b) (a < b)
#define compEQ(a,b) (a == b)

/////////////////////////////////////
// implementation independent code //
/////////////////////////////////////

typedef enum {
    RBT_STATUS_OK,
    RBT_STATUS_MEM_EXHAUSTED,
    RBT_STATUS_DUPLICATE_KEY,
    RBT_STATUS_KEY_NOT_FOUND
} RbtStatus;

typedef enum { BLACK, RED } nodeColor;

typedef struct NodeTag {
    struct NodeTag *left;       // left child
    struct NodeTag *right;      // right child
    struct NodeTag *parent;     // parent
    nodeColor color;            // node color (BLACK, RED)
    KeyType key;                // key used for searching
    ValType val;                // data related to key
} NodeType;

#define SENTINEL &sentinel      // all leafs are sentinels
static NodeType sentinel = { SENTINEL, SENTINEL, 0, BLACK, 0};

static NodeType *root = SENTINEL; // root of red-black tree

static void rotateLeft(NodeType *x) {

    // rotate node x to left

    NodeType *y = x->right;

    // establish x->right link
    x->right = y->left;
    if (y->left != SENTINEL) y->left->parent = x;

    // establish y->parent link
    if (y != SENTINEL) y->parent = x->parent;
    if (x->parent) {
        if (x == x->parent->left)
            x->parent->left = y;
        else
            x->parent->right = y;
    } else {
        root = y;
    }

    // link x and y
    y->left = x;
    if (x != SENTINEL) x->parent = y;
}

static void rotateRight(NodeType *x) {

    // rotate node x to right

    NodeType *y = x->left;

    // establish x->left link
    x->left = y->right;
    if (y->right != SENTINEL) y->right->parent = x;

    // establish y->parent link
    if (y != SENTINEL) y->parent = x->parent;
    if (x->parent) {
        if (x == x->parent->right)
            x->parent->right = y;
        else
            x->parent->left = y;
    } else {
        root = y;
    }

    // link x and y
    y->right = x;
    if (x != SENTINEL) x->parent = y;
}

static void insertFixup(NodeType *x) {

    // maintain red-black tree balance
    // after inserting node x

    // check red-black properties
    while (x != root && x->parent->color == RED) {
        // we have a violation
        if (x->parent == x->parent->parent->left)
		{
            NodeType *y = x->parent->parent->right;
            if (y->color == RED)
			{

                // uncle is RED
                x->parent->color = BLACK;
                y->color = BLACK;
                x->parent->parent->color = RED;
                x = x->parent->parent;
            } else 
			{

                // uncle is BLACK
                if (x == x->parent->right) 
				{
                    // make x a left child
                    x = x->parent;
                    rotateLeft(x);
                }

                // recolor and rotate
                x->parent->color = BLACK;
                x->parent->parent->color = RED;
                rotateRight(x->parent->parent);
            }
        } 
		else 
		{

            // mirror image of above code
            NodeType *y = x->parent->parent->left;
            if (y->color == RED) {

                // uncle is RED
                x->parent->color = BLACK;
                y->color = BLACK;
                x->parent->parent->color = RED;
                x = x->parent->parent;
            } else {

                // uncle is BLACK
                if (x == x->parent->left) {
                    x = x->parent;
                    rotateRight(x);
                }
                x->parent->color = BLACK;
                x->parent->parent->color = RED;
                rotateLeft(x->parent->parent);
            }
        }
    }
    root->color = BLACK;
}

// insert new node (no duplicates allowed)
RbtStatus rbtInsert(KeyType key, ValType val) {
    NodeType *current, *parent, *x;

    // allocate node for data and insert in tree

    // find future parent
    current = root;
    parent = 0;
    while (current != SENTINEL) {
        if (compEQ(key, current->key)) 
            return RBT_STATUS_DUPLICATE_KEY;
        parent = current;
        current = compLT(key, current->key) ?
            current->left : current->right;
    }

    // setup new node
    if ((x = malloc (sizeof(*x))) == 0)
        return RBT_STATUS_MEM_EXHAUSTED;
    x->parent = parent;
    x->left = SENTINEL;
    x->right = SENTINEL;
    x->color = RED;
    x->key = key;
    x->val = val;

    // insert node in tree
    if(parent) {
        if(compLT(key, parent->key))
            parent->left = x;
        else
            parent->right = x;
    } else {
        root = x;
    }

    insertFixup(x);

    return RBT_STATUS_OK;
}

static void deleteFixup(NodeType *x) {

    // maintain red-black tree balance
    // after deleting node x

    while (x != root && x->color == BLACK) {
        if (x == x->parent->left) {
            NodeType *w = x->parent->right;
            if (w->color == RED) {
                w->color = BLACK;
                x->parent->color = RED;
                rotateLeft (x->parent);
                w = x->parent->right;
            }
            if (w->left->color == BLACK && w->right->color == BLACK) {
                w->color = RED;
                x = x->parent;
            } else {
                if (w->right->color == BLACK) {
                    w->left->color = BLACK;
                    w->color = RED;
                    rotateRight (w);
                    w = x->parent->right;
                }
                w->color = x->parent->color;
                x->parent->color = BLACK;
                w->right->color = BLACK;
                rotateLeft (x->parent);
                x = root;
            }
        } else {
            NodeType *w = x->parent->left;
            if (w->color == RED) {
                w->color = BLACK;
                x->parent->color = RED;
                rotateRight (x->parent);
                w = x->parent->left;
            }
            if (w->right->color == BLACK && w->left->color == BLACK) {
                w->color = RED;
                x = x->parent;
            } else {
                if (w->left->color == BLACK) {
                    w->right->color = BLACK;
                    w->color = RED;
                    rotateLeft (w);
                    w = x->parent->left;
                }
                w->color = x->parent->color;
                x->parent->color = BLACK;
                w->left->color = BLACK;
                rotateRight (x->parent);
                x = root;
            }
        }
    }
    x->color = BLACK;
}

// delete node
RbtStatus rbtErase(NodeType * z) {
    NodeType *x, *y;

    if (z->left == SENTINEL || z->right == SENTINEL) {
        // y has a SENTINEL node as a child
        y = z;
    } else {
        // find tree successor with a SENTINEL node as a child
        y = z->right;
        while (y->left != SENTINEL) y = y->left;
    }

    // x is y's only child
    if (y->left != SENTINEL)
        x = y->left;
    else
        x = y->right;

    // remove y from the parent chain
    x->parent = y->parent;
    if (y->parent)
        if (y == y->parent->left)
            y->parent->left = x;
        else
            y->parent->right = x;
    else
        root = x;

    if (y != z) {
        z->key = y->key;
        z->val = y->val;
    }


    if (y->color == BLACK)
        deleteFixup (x);

    free (y);

    return RBT_STATUS_OK;
}

// find key
NodeType *rbtFind(KeyType key) {
    NodeType *current;
    current = root;
    while(current != SENTINEL) {
        if(compEQ(key, current->key)) {
            return current;
        } else {
            current = compLT (key, current->key) ?
                current->left : current->right;
        }
    }
    return NULL;
}

// in-order walk of tree
void rbtInorder(NodeType *p, void (callback)(NodeType *)) {
    if (p == SENTINEL) return;
    rbtInorder(p->left, callback);
    callback(p);
    rbtInorder(p->right, callback);
}

// delete nodes depth-first
void rbtDelete(NodeType *p) {
    if (p == SENTINEL) return;
    rbtDelete(p->left);
    rbtDelete(p->right);
    free(p);
}

void displayNode(NodeType *p) {
    printf("%d %d\n", p->key, p->val.stuff);
}

int main(int argc, char **argv) {
    int maxnum, ct;
    KeyType key;
    RbtStatus status;

    // command-line:
    //
    //   rbt 2000
    //      process 2000 records

    NodeType *p;

    maxnum = atoi(argv[1]);

    printf("maxnum = %d\n", maxnum);
    for (ct = maxnum; ct; ct--) {
        key = rand() % 90 + 1;
        if ((p = rbtFind(key)) != NULL) {
            if (p->val.stuff != 10*key) printf("fail val\n");
            status = rbtErase(p);
            if (status) printf("fail: status = %d\n", status);
        } else {
            ValType val;
            val.stuff = 10*key;
            status = rbtInsert(key, val);
            if (status) printf("fail: status = %d\n", status);
        }
    }

    // output nodes in order
    rbtInorder(root, displayNode);

    rbtDelete(root);

    return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区四区中文字幕| 亚洲国产精品成人综合| 高清国产一区二区| 日韩中文字幕亚洲一区二区va在线| 久久久久99精品国产片| 欧美三级电影在线看| 成人网页在线观看| 欧美bbbbb| 亚洲一区影音先锋| 国产精品色在线| 精品国产一区二区三区忘忧草| 欧洲精品中文字幕| av资源网一区| 国产成人综合视频| 狠狠色丁香久久婷婷综合_中| 亚洲一区二区精品久久av| 成人免费一区二区三区视频 | 在线观看亚洲一区| 成人精品视频一区二区三区| 裸体健美xxxx欧美裸体表演| 亚洲综合在线第一页| 国产精品黄色在线观看| 日韩国产在线观看一区| 亚洲欧洲日韩在线| 国产丝袜在线精品| 国产日韩精品一区二区三区在线| 精品久久久久久综合日本欧美| 国产激情91久久精品导航| 九九九精品视频| 免费成人在线网站| 蜜桃91丨九色丨蝌蚪91桃色| 日韩电影免费一区| 日韩av电影免费观看高清完整版 | 精品一区二区三区久久| 热久久久久久久| 日产欧产美韩系列久久99| 视频一区欧美精品| 午夜免费欧美电影| 午夜精品一区二区三区电影天堂 | 懂色av一区二区在线播放| 极品少妇xxxx精品少妇偷拍| 久久成人综合网| 国产自产视频一区二区三区| 国产乱码字幕精品高清av | 一区二区三区波多野结衣在线观看| 中文字幕 久热精品 视频在线| 国产精品情趣视频| 国产精品成人免费精品自在线观看| 国产精品麻豆欧美日韩ww| 亚洲天堂免费在线观看视频| 亚洲人被黑人高潮完整版| 一区二区三国产精华液| 亚洲电影一级黄| 捆绑变态av一区二区三区| 国模少妇一区二区三区| 成人a区在线观看| 欧美在线播放高清精品| 在线不卡欧美精品一区二区三区| 日韩一卡二卡三卡| 欧美国产一区二区| 亚洲欧美激情插| 视频一区国产视频| 国产精品系列在线播放| 91在线视频在线| 欧美另类一区二区三区| 久久亚洲精精品中文字幕早川悠里| 国产女主播视频一区二区| 亚洲三级在线观看| 免费人成黄页网站在线一区二区| 激情图片小说一区| av一区二区三区四区| 欧美丝袜丝交足nylons图片| 欧美喷潮久久久xxxxx| 337p日本欧洲亚洲大胆精品| 亚洲欧洲美洲综合色网| 日韩av不卡在线观看| 成人午夜在线播放| 欧美区一区二区三区| 国产午夜精品久久久久久免费视| 亚洲欧美电影一区二区| 免费成人在线影院| 91首页免费视频| 日韩一区二区视频| 亚洲精品综合在线| 国产一区二三区好的| 色老汉一区二区三区| 91精品国产一区二区三区| 国产日本一区二区| 日韩高清中文字幕一区| www.亚洲免费av| 日韩精品综合一本久道在线视频| 国产精品婷婷午夜在线观看| 日韩精品电影在线观看| gogo大胆日本视频一区| 日韩一区二区三区视频在线 | 欧美一级高清片在线观看| 中文字幕字幕中文在线中不卡视频| 日韩国产在线观看一区| 99久久99久久综合| 2021中文字幕一区亚洲| 亚洲国产精品久久人人爱蜜臀| 高清视频一区二区| 精品久久一二三区| 午夜精品久久久久久久久| 成人av电影在线网| 精品国产伦一区二区三区观看方式| 亚洲主播在线观看| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美v亚洲v综合ⅴ国产v| 亚洲午夜久久久久久久久电影网| 国产盗摄视频一区二区三区| 日韩一区二区三区免费看| 亚洲成人自拍一区| 日本韩国一区二区三区| 中文字幕日韩一区| 成人午夜免费电影| 久久久久久9999| 国产一区二区三区免费看| 884aa四虎影成人精品一区| 亚洲一区免费观看| 欧美综合色免费| 亚洲欧美一区二区三区极速播放 | 国产精品国产精品国产专区不蜜| 精品一区二区综合| 精品毛片乱码1区2区3区| 美腿丝袜亚洲色图| 日韩欧美国产精品| 久久国产成人午夜av影院| 91精品国产一区二区三区香蕉| 亚洲国产裸拍裸体视频在线观看乱了| 成人综合婷婷国产精品久久蜜臀| 久久九九国产精品| 国产一区二区精品久久99| 国产亚洲视频系列| 国产成人精品亚洲日本在线桃色| 国产视频一区在线观看| 国产精品综合av一区二区国产馆| 精品国产乱码久久久久久久| 九九国产精品视频| 国产日韩精品久久久| 国产福利91精品一区二区三区| 日韩精品一区二区三区视频 | 欧美日本在线一区| 三级久久三级久久| 欧美成人一级视频| 国产又黄又大久久| 国产精品第一页第二页第三页| 成a人片国产精品| 亚洲欧美激情一区二区| 欧美三日本三级三级在线播放| 性做久久久久久久免费看| 91精品国产欧美一区二区18 | 蜜桃av一区二区三区电影| 日韩欧美在线观看一区二区三区| 美国欧美日韩国产在线播放| 久久中文字幕电影| www..com久久爱| 亚洲国产精品精华液网站| 91精品中文字幕一区二区三区| 久久精品72免费观看| 久久青草国产手机看片福利盒子 | 中文字幕欧美日本乱码一线二线| 成人黄色777网| 一区二区三区精品久久久| 欧美一级高清片| 成人黄色小视频| 婷婷综合五月天| 久久综合成人精品亚洲另类欧美 | 亚洲bt欧美bt精品| 精品国精品自拍自在线| 99视频超级精品| 天堂一区二区在线| 欧美激情在线看| 欧美日韩卡一卡二| 国产剧情一区二区| 亚洲黄色av一区| 久久亚洲精华国产精华液 | 亚洲最新视频在线观看| 欧美一区二区三区男人的天堂| 国产成人免费网站| 丝袜亚洲精品中文字幕一区| 国产欧美一区视频| 欧美人狂配大交3d怪物一区| 成人午夜av影视| 蜜桃一区二区三区在线| 亚洲欧美一区二区不卡| 精品福利一区二区三区免费视频| 91在线云播放| 国产精品乡下勾搭老头1| 性久久久久久久| 国产精品久久影院| 欧美大尺度电影在线| 一本色道a无线码一区v| 国产精品一区免费在线观看| 舔着乳尖日韩一区| 国产精品不卡在线观看| 精品久久久久久久久久久院品网| 欧美亚洲一区二区三区四区| 成人综合激情网| 久久不见久久见免费视频1|