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

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

通用數(shù)據(jù)結構

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

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;}
};

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

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ù)指針之后,整個數(shù)據(jù)結構顯得有點復雜。但是我們沒有辦法,這是設計通用數(shù)據(jù)結構必須花的一個代價。那么有了這個數(shù)據(jù)結構之后,如何才能實現(xiàn)對整個隊列的數(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;
}

總結:

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

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