2014-08-29 69 views
-5

該函數可以很好地工作,但是當我多次插入同一個姓氏時,問題就出現了。請幫忙,這是我的學校項目。對鏈接列表中的字符串進行排序

void sortList(node*head) 
{ 
    node*temp2; 
    node*temp3; 
    string tmp, tmp1, tmp2; 
    unsigned long long tmp3; 
    unsigned long long num; 

    for(temp2= head; temp2 != NULL; temp2 = temp2->next) 
    { 
     for(temp3 = temp2-> next; temp3 != NULL; temp3 = temp3 ->next) 
     { 
      if(temp2 ->surname > temp3 ->surname) 
      { 
       tmp = temp2 ->surname; 
       tmp1 = temp2 ->name; 
       tmp2 = temp2 ->date; 
       tmp3 = temp2 ->num; 
       temp2 ->name = temp3 ->surname; 
       temp2 ->surname = temp3 ->name; 
       temp2 ->date = temp3 -> date; 
       temp2 ->num = temp3 -> num; 
       temp3 ->surname = tmp; 
       temp3 ->name = tmp1; 
       temp3 ->date = tmp2; 
       temp3 ->num = tmp3; 
      } 
     } 
    } 
} 
+0

您可以使用'的std :: swap'(或你自己的'swap'如果你不能使用它)來清理代碼。 – Jarod42 2014-08-29 09:25:08

+4

您應該使用明智的,描述性的變量名稱,而不是'tmp','tmp1','tmp2','tmp3','temp2'和'temp3'。 – 2014-08-29 09:28:07

+1

我看不出有任何理由推測這一點。 OP已經在他的函數體中使用了std :: string,所以沒有理由相信他以前沒有。 – Puppy 2014-08-29 09:46:57

回答

-2

首先我會通過使用更多的描述性變量使代碼更具可讀性。其次,我將使用STL函數和容器來解決這個冒泡排序算法。

假設你必須使用你自己的實現,我建議複習一下你在這裏使用的string :: operator>(...)函數。你可以在這裏發佈,如果你想,所以我們可以檢討它。

希望這會有所幫助。

Carles。

2

你在你的代碼的交換部分簡單的錯誤:

// temp2->name = temp3->surname; 
// temp2->surname = temp3->name; 

// should be: 
temp2->name = temp3->name; 
temp2->surname = temp3->surname; 

與其他人一樣已經指出的,代碼可能是乾淨多了,這也將有助於避免此類錯誤(他們會更容易至少是現貨)。

我該如何確定如果他們有相同的姓氏,那麼他們的第一名的優先級應該用來確定他們的順序? - Jdons

在這種情況下,我建議使用一個輔助功能,用於確定兩個節點的順序:

bool isLessThan(node* lhs, node* rhs) 
{ 
    if (lhs->surname == rhs->surname) 
    { 
     // if they have the same surname, 
     // use the firstname 
     return lhs->name < rhs->name; 
    } 
    else 
    { 
     // else use surname 
     return lhs->surname < rhs->surname; 
    } 
} 

(這不是最有效的方式,一個可以使用運營商<相反,但我想保持簡單)在原始代碼

用法:

for(temp2= head; temp2 != NULL; temp2 = temp2->next) 
{ 
    for(temp3 = temp2-> next; temp3 != NULL; temp3 = temp3 ->next) 
    { 
     if(!isLessThan(temp2, temp3)) 
     { 
      [...] 
     } 
    } 
} 
+0

我已經糾正並正常工作,謝謝但只有一件事,我如何確保如果他們有相同的姓氏,那麼他們的第一名的優先級應該用來確定他們的順序? – Jdons 2014-08-29 11:51:29

+0

(在回覆帖子的編輯中回答了您的後續問題) – Horstling 2014-08-29 12:10:21

相關問題