2010-12-15 12 views
0

私はIDと名前の2つのフィールドを持っています。リンクされたリストにノードを挿入すると、降順でIDでソートしたいと思います。異なる人が同じIDを持つ可能性があると仮定します。例リンクされたリストを使用した並べ替え

1001 CHARICE -> 1001 JUSTIN -> 1001 ANNA -> 1000 CHYNA -> 888 MIKEY -> NULL 

について最終的なリストは、次のようになります。

1001 ANNA -> 1001 CHARICE -> 1001 JUSTINE -> 1000 CHYNA -> 888 MIKEY -> NULL 

IDが降順にソートされている間、私は昇順で同じIDと名前を並べ替えます。ここに私のコードです:

NODE* insert_std(NODE *head, NODE* std){ 
    NODE *prev, *cur; 
    if(head==NULL) return std; 
    cur = head; 
    while (cur != NULL && std->ID < cur->ID){ 
     prev = cur; 
     cur = cur->next; 
    } 
    if(std->ID == cur->ID){ 
     while (cur != NULL && strcmp(std->name, cur->name)>=0){ 
      prev = cur; 
      cur = cur->next; 
     } 
    }  
    if (head==cur){ 
     if(std->ID >= head->ID) { 
     std->next = head; 
     head = std; 
     } 
    } else { 
     std->next = cur; 
     prev->next = std; 
    } 
    return head; 
} 

しかし、私はそれを望むようにソートされていないです。私は間違って何をしていますか?

+0

&& std->ID == cur->IDを追加します。 – pmg

+1

これは便利です:http://en.wikipedia.org/wiki/Sentinel_node – ruslik

+0

クイックソートアルゴを使ってこの問題の解決策を見つけてください。 user1596193

答えて

2

挿入機能では、2つのノードを比較するたびに2つのIDを比較します。一方が他方よりも小さい場合は、どのノードが最初に来るべきかがわかります。 IDが同じ場合は、どのノードが最初に来るのかを判断するために名前を比較する必要があります。

std->ID <= cur->IDstd->ID > head->IDの値になります。私があなたの場合は、NODE(AとBと呼ぶ)へのポインタを2つ持ち、上記の方法でそれらを比較し、ノードAがノードBの前に来たらtrueを返すヘルパ関数を書くでしょう。insert_stdにこの関数を組み込みますそれでは些細なことです。

2

単純にID値の比較を置き換えて、ID値が同じ場合は名前を考慮してください(たとえばstrcmpを使用)。最も簡単な方法は、このジョブを実行する2つのレコードを比較するための別の関数を書くことです。

0

は、文字列は `strcmp`(またはPOSIX` strcasecmp`)を使用比較するには、whileループ

while (cur != NULL && std->ID == cur->ID && strcmp(std->name, cur->name)>=0) 
関連する問題