2013-07-01 38 views
1

我有2個函數。函數查找並執行雙向搜索,意味着它按部分搜索數組,直到找到該鍵並返回其位置。函數removef或(快速移除)抓取該位置並將其從字符串數組中移除。我正在使用一個命令行界面,要求用戶輸入一個命令和一個字符串(被刪除的字符串),因此不需要提示用戶輸入字符串。使用雙向搜索從陣列中刪除字符串

這是我的查找功能

int StringList::Find(string key, int start, int end) 
{ 
    int middle = (end + start)/2; 
    if (key > str[middle]) 
    { 
     return Find(key,middle,end); 
    } 
    else if (key < str[middle]) 
    { 
     return Find(key,start,middle); 
    } 
    else if (key == str[middle]) 
    { 
     return middle; 
    } 
} 

查找功能應該確定密鑰是否是在該陣列的上段或下段(在中部以上或低於中間),則保持分裂,直到找到它需要刪除的密鑰或字符串。

這裏是removef:

void StringList::removef(string s) 
{ 
    int loc = Find(s,0,10000); //ignore these parameters, i know they are wrong they are just an example 


     for(int j=loc; j<(numberOfStrings)-1; j++) 
     { 
      str[j] = str[j+1]; 
     } 
     numberOfStrings--; 

} 

我的問題是使用雙截面搜索我的查找功能。任何我可以修復的建議?我真的陷入困境。謝謝!

+0

可能是一個愚蠢的問題,但你的數組排序?另外,如果字符串不在數組中,你的Find函數將不起作用。 –

+0

@TaylorBrandstetter是的,它是按字母順序排序的另一個功能。至於發現不工作,我只會添加一個if語句,表明它是否不返回-1。如果-1它將打印「字符串不存在」 – WestonBuckeye

+0

在這種情況下,我會檢查它確實是在調用Find函數時排序的。你的代碼適用於我的排序數組。 –

回答

2

我可以看到的一個問題是,當鍵大於中間元素時,您將新範圍設置爲[midde,end],但它應該是[middle+1,end] - 再考慮中間元素沒有意義,因爲您已經知道這不是一場比賽。

所以這第一個條件應該是這樣的:

if (key > str[middle]) 
{ 
    return Find(key,middle+1,end); 
} 

而且,正如其他人所說,你需要一個檢查,看看是否該字符串不是在數組中。我建議在Find方法的開頭添加這樣的內容。

if (start == end) return -1; 

一旦你細分數組下降到開始等於結束,有沒有更多的空間來搜索和您的字符串wron't找到了點。

除此之外,我唯一能想到的可能是錯誤的是您打電話Find方法的範圍有誤。它應該這樣調用:

int loc = Find(s,0,numberOfStrings); 
+0

你先生救了我的命!該錯誤是在我的刪除功能中調用查找 – WestonBuckeye

1

首先,我假設你已經對字符串'str'數組進行了排序......否則二進制搜索將不起作用。

在你的'查找'函數中,你可以訪問'str'數組,我假設你是字符串數組,但是你不會將這個數組作爲參數傳遞。所以,除非它是一個嘗試訪問它的全局數組將不起作用。

最後,由於您在遞歸調用此函數,因此您需要有一個處理數組中根本不包含的字符串。

+0

我有一個名爲StringList的類,如上所述,它有str []數組。我的順序搜索工作。我的平分搜索沒有。我可以簡單地編寫一條if語句來修復不存在的字符串 – WestonBuckeye

+0

添加if語句時函數是否工作? – Greysquall

+0

不,它不@Greysquall – WestonBuckeye