2012-02-26 66 views
0

假設我有一個外部庫BST,處理自定義數據類型插入一個BST含自定義數據

這裏有new_node,插入和搜索函數C二叉搜索樹.C,假設我讀txt文件的車型:

#include <stdio.h> 
#include <stdlib.h> 
#include "bst.h" 
#include <string.h> 

#define MAX 50 

typedef struct data_t{ 
    int gg,mm,aaaa;  
}data; 

typedef struct accesories_t{ 
    char name[MAX]; 
    int price; 
    struct accesories_t *next;  
}accesories; 

typedef struct model_t{ 
    //int index; 
    char name[MAX]; 
    char file_a[MAX]; 
    data date; 
    int price; 
    accesories *acs; 
}model; 


int main(int argc, char *argv[]) 
{ 
    int menu=0; 

    char nf[MAX]; 

    char name[MAX]; 
    char fa[MAX]; 
    int price,gg,mm,a; 

    strcpy(nf,argv[1]); 

    FILE *fp=fopen(nf,"+r"); 
    model m; 
    struct bst_node* root = NULL; 

    while(fscanf(fp,"%s %d//%d//%d %d %s",name,gg,mm,a,price,fa)!=EOF){ 
     strcpy(m.name,name); 
     strcpy(m.file_a,fa); 
     m.date.gg=gg; 
     m.date.mm=mm; 
     m.date.aaaa=a; 
     m.price=price; 
     m.index=index++; 

     insert(&root ,m); 
    } 

    system("PAUSE"); 
    return 0; 
} 

所以我的問題出現在搜索功能,如何管理自定義數據的比較(假設插入模型由南排序e(strcmp)? 我我如何能名字傳給鑑於bst.c不知道我的模型結構是如何做出的bst.c很困惑。

我應該修改BST庫,也許在BST結構添加數據之前,某種指標和使用,作爲比較?

OK我已經成功通過添加字符串鍵的結構BST

我想要現在實現是返回void *的數據型鑄造成模型結構, 假設內部修復_I得到了與包含數據的節點樹,有一次我做搜索,我想返回 例如包含在其上的一個節點和工作數據,任何線索????

試圖像成纔沒有任何成功 假設節點從一個搜索功能

model *m; 
m=(model*)node->data; 

返回的節點我怎麼能做到這一點?

+0

你可以在一個額外的參數傳遞給它的函數指針需要比較的所有功能。 – wildplasser 2012-02-26 15:10:05

+0

或者你可以通過在BST創建時間 – Kevin 2012-02-26 15:13:29

+0

完全函數指針。 (但是這將創建一個特殊的「頭」節點類型的需要)你走了。在你的服務.... – wildplasser 2012-02-26 15:14:52

回答

0

實施例用於使用比較功能作爲回調。爲簡潔起見省略了定義。

int llist_cmp(struct llist *l, struct llist *r) 
{ 
if (!l) return 1; 
if (!r) return -1; 
return strcmp(l->payload,r->payload); 
} 

struct llist * llist_split(struct llist **hnd, int (*cmp)(struct llist *l, struct llist *r)) 
{ 
struct llist *this, *save, **tail; 

for (save=NULL, tail = &save; this = *hnd;) { 
     if (! this->next) break; 
     if (cmp(this, this->next) <= 0) { hnd = &this->next; continue; } 
     *tail = this->next; 
     this->next = this->next->next; 
     tail = &(*tail)->next; 
     *tail = NULL; 
     } 
return save; 
} 

struct llist * llist_merge(struct llist *one, struct llist *two, int (*cmp)(struct llist *l, struct llist *r)) 
{ 
struct llist *result, **tail; 

for (result=NULL, tail = &result; one && two; tail = &(*tail)->next) { 
     if (cmp(one,two) <=0) { *tail = one; one=one->next; } 
     else { *tail = two; two=two->next; } 
     } 
*tail = one ? one: two; 
return result; 
} 

順便說一句:將上面的片段手柄鏈表,但用於使函數指針的機制是一樣的樹木,當然。畢竟這是功課;-)

+0

我仍然無法找到如何在我的bst.c函數中管理model.name的方法,它告訴我應該使用void指針,但是例如當我將模型項傳遞給它時調用new_node函數我沒有Ideea如何比較該item.name – 2012-02-26 17:02:08

+0

那麼,在你的main()中你聲明m是一個(結構)模型。將它改爲一個指針,並且在你需要的時候將malloc的空間用於m(在fscanf()循環中)插入函數也可能需要改變(它已經將void *指針作爲參數)。並創建比較函數,可能會比較結構中的名稱,類似於我的代碼片段。 – wildplasser 2012-02-26 17:49:59