2016-01-12 26 views
0

根據給定的頭文件,我從計算機科學的大學課程中獲得任務,構建二叉搜索樹。 但是,我不太瞭解它的功能,它是指針和結構的組合。理解給定的頭文件

這是頭文件:

#ifndef GENBST_H 
#define GENBST_H 
#include <stdio.h> 
#include <stdlib.h> 
typedef void* Elm; 
typedef void* BST; 
typedef void* BST_ROOT; 
typedef enum {SUCEESS, OUT_OF_MEM, BAD_ARGS, FAILURE } Result; 
BST_ROOT BSTCreate(Elm root_val, Elm (*create_elm)(), 
    void (*cpy_elm) (Elm,Elm), 
    int (*cmp_elm) (Elm, Elm), 
    void (*free_elm)(Elm)); 
void BSTDestroy (BST_ROOT root); 
Result BSTAddElement (BST_ROOT root, Elm node); 
Result BSTRemoveElement (BST_ROOT root, Elm node); 
Elm BSTFindElement (BST_ROOT root, Elm node); 
#endif 

你能幫我找出每一個功能意味着什麼? 具體在BSTCreate函數中?

+2

如果您沒有任何文檔或源代碼,您無法知道頭文件的功能。你可以知道的唯一事情就是你在這裏:函數名,typedef,最終是一些結構聲明。 我認爲你的任務是編碼.c,它實現了可以在這個.h中找到的函數。這是你的工作,使這裏宣佈的功能。 – Magix

+0

當然,我需要建立c文件來實現標題中的功能,我的問題是我不明白什麼是寫在功能上。 – ohad

+0

如果一個答案解決了你的問題或幫助你,請考慮接受它,另請參閱: http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –

回答

0

我不能給出一個完整的答案,但我希望這個解釋能幫助你。

首先,正如Magix的評論所述,頭文件中沒有函數定義,但頭文件給出了接口應該如何的規範。它指定了函數原型和變量的類型,給定這些,你應該能夠實現BST。

試着寫下一個算法,看看你是否可以通過使用在這個頭中聲明的所有原型來實現它。 說,這樣做對兩行解釋也會有很大的幫助;)

讓我們來看看每一個標題! 樹中的所有首先你給出的元素和BST的類型:

typedef void* Elm; 
typedef void* BST; 
typedef void* BST_ROOT; 

然後枚舉指定一些返回類型,你可以使用的值:

typedef enum { 
SUCCESS,   // 0 (I corrected the spell) 
OUT_OF_MEM,  // 1 
BAD_ARGS,   // 2 
FAILURE   // 3 
} Result;   

在這裏,你明白你必須提供一個創建BST的函數。

BST_ROOT BSTCreate( 
    Elm root_val, 
    Elm (*create_elm)(), 
    void (*cpy_elm) (Elm,Elm), 
    int (*cmp_elm) (Elm, Elm), 
    void (*free_elm)(Elm)); 

此功能必須使用其他四個功能:

Elm (*create_elm)(), 
    void (*cpy_elm) (Elm,Elm), 
    int (*cmp_elm) (Elm, Elm), 
    void (*free_elm)(Elm) 

最後,你還應該提供一組函數來修改BST:

void BSTDestroy (BST_ROOT root); 
Result BSTAddElement (BST_ROOT root, Elm node); 
Result BSTRemoveElement (BST_ROOT root, Elm node); 
Elm BSTFindElement (BST_ROOT root, Elm node); 
+0

謝謝你切割它:) – ohad

0

這是某種形式的半 - 對類型泛型編程的失敗嘗試和創建ADT(「抽象數據類型」)。 「半失敗」,因爲太慷慨地使用void指針而沒有類型安全。特別是,隱藏typedef後面的指針是非常糟糕的做法。無論如何...

Elm可能指的是「元素」,即存儲在樹中的實際數據。那麼root_val顯然會成爲樹的最高值。

其餘參數是函數指針。它是一個排序模板:函數必須具有指定的格式。

顯然你是爲了給你創建的每一棵樹提供指向數據特定函數的指針。對於每種特定的數據類型,這些功能可以以適當的方式實現。你可以爲int設置一組函數,爲字符串等設置一組函數。併爲每個這樣的數據類型創建一種樹。

create_elmfree_elm是指向創建/刪除特定類型的元素(與C++中的構造函數/析構函數進行比較)的函數的指針。

cpy_elm可能應該是一個複製特定元素的函數(與C++中的重載賦值運算符進行比較)。

cmp_elm是實際的比較函數,可能應該返回-1,0或1,具體取決於param1小於,等於還是大於param2。看看如何使用C標準bsearch函數,這個函數的含義會變得更清晰。 SO上有很多例子。

+0

謝謝,我的第一步瞭解它。 現在,這是什麼意思? 「榆樹(* create_elm)()」 以我的理解,我需要創建函數指針「create_elm,即榆樹類型,但我怎麼能發送不同類型的數據到一個單一的功能? – ohad

+0

@ohad你使用與該函數指針相同的簽名來創建一個自定義函數,例如:'Elm create_string(void){return calloc(1,10);}'然後將'create_string'的指針作爲'create_elm'參數,你的函數調用最終會看起來像(字符串示例):'BST_ROOT bst_string = BSTCreate(「hello world」,create_string,copy_string,cmp_string,free);'第一個參數是我編寫的一些虛擬值,其餘的是與列出的函數指針匹配的函數。 – Lundin