在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ 通用數(shù)據(jù)結(jié)構(gòu)
hash表
單詞統(tǒng)計(jì)
鏈表排序
查找
可變參數(shù)
爬樓梯
內(nèi)存
prim算法 中
線性結(jié)構(gòu)的處理
數(shù)據(jù)選擇
prim算法 上
循環(huán)單向鏈表
基數(shù)排序
堆排序
鏈表重合
排序二叉樹的保存和加載
圖添加和刪除
排序二叉樹線索化
非遞歸排序
字符串查找 下篇
鏈表逆轉(zhuǎn)
函數(shù)堆棧顯示
遞歸和堆棧
二叉樹深度遍歷
線性隊(duì)列
循環(huán)和遞歸
快速排序
尋找丟失的數(shù)
A*算法
克魯斯卡爾算法 下
排序二叉樹
大數(shù)計(jì)算
二叉樹廣度遍歷
prim算法 下
洗牌算法
圖結(jié)構(gòu)
最大公約數(shù)、最小公倍數(shù)
圖創(chuàng)建
雙向鏈表
字符串查找 上篇
尋路
通用算法的編寫
哈夫曼樹 下
線性堆棧
八皇后
排序二叉樹刪除-1
挑選最大的n個(gè)數(shù)
字符串查找 中篇
哈夫曼樹 上
合并排序
回?cái)?shù)
選擇排序
哈希二叉樹
通用數(shù)據(jù)結(jié)構(gòu)
“數(shù)星星”
單向鏈表
排序二叉樹插入
圖的保存
排序二叉樹刪除-2
排序二叉樹刪除-3
n!中末尾零的個(gè)數(shù)統(tǒng)計(jì)

通用數(shù)據(jù)結(jié)構(gòu)

上一篇博客介紹了通用算法,那么有了這個(gè)基礎(chǔ)我們可以繼續(xù)分析通用數(shù)據(jù)結(jié)構(gòu)了。我們知道在c++里面,既有數(shù)據(jù)又有函數(shù),所以一個(gè)class就能干很多事情。舉一個(gè)簡(jiǎn)單的例子來說,我們可以編寫一個(gè)數(shù)據(jù)的class計(jì)算類。

class calculate{
    int m;
    int n;
public:

    calculate():m(0),n(0) {}
    calculate(int a, int b):m(a),n(b) {}
    ~calculate() {}

    int add() { return m+n; }
    int sub() { return m-n; }
    int mul() { return m *n;}
    int div() { return (n!=0) ?m /n : -1;}
};

那么我們可不可以仿造這個(gè)思路,在常用的數(shù)據(jù)結(jié)構(gòu)里面添加一些函數(shù)指針呢?至于為什么要這些函數(shù)指針,主要是因?yàn)槲覀冊(cè)O(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)是通用的數(shù)據(jù)類型,那么其中必然有一些譬如compare的函數(shù)需要具體數(shù)據(jù)類型的參與?,F(xiàn)在,我們定義一個(gè)循環(huán)隊(duì)列,

typedef struct _QUEUE
{
    int start;
    int end;
    int length;
    int count;
    void** head;

    int (*compare)(void*, void*);
    void (*print)(void*);
    void* (*find)(void*, void*);
}QUEUE;

那么QUEUE的創(chuàng)建函數(shù)、打印函數(shù)有什么區(qū)別嗎?

QUEUE* create_new_queue(int length)
{
    QUEUE* pQueue;
    if(0 == length)
        return NULL;

    pQueue = (QUEUE*)malloc(sizeof(QUEUE));
    assert(NULL != pQueue);

    pQueue->head = (void**)malloc(sizeof(void*)* length);
    assert(NULL != pQueue->head);

    pQueue->start = 0;
    pQueue->end = 0;
    pQueue->count = 0;
    pQueue->length = length;

    pQueue->compare = compare;
    pQueue->find = find;
    pQueue->print = print;
    return pQueue;
}

有了函數(shù)指針之后,整個(gè)數(shù)據(jù)結(jié)構(gòu)顯得有點(diǎn)復(fù)雜。但是我們沒有辦法,這是設(shè)計(jì)通用數(shù)據(jù)結(jié)構(gòu)必須花的一個(gè)代價(jià)。那么有了這個(gè)數(shù)據(jù)結(jié)構(gòu)之后,如何才能實(shí)現(xiàn)對(duì)整個(gè)隊(duì)列的數(shù)據(jù)打印呢?朋友們可以自己寫一下,再看看我寫的是否正確。

void print_value_in_queue(QUEUE* pQueue)
{
    int index ;
    int end;
    if(NULL == pQueue || 0 == pQueue->count)
        return;

    end = pQueue->start;
    if(end < pQueue->end)
        end = pQueue->end + pQueue->length;

    for(index = pQueue->start; index < end; index ++){
        pQueue->print(pQueue->head[index % pQueue->length]);
    }

    return;
}

總結(jié):

(1)剩下還有compare、find兩個(gè)子函數(shù),朋友們可以想想怎么利用?

(2)通用數(shù)據(jù)結(jié)構(gòu)有很多好處,寫的越熟,用得越好。