2012-02-20 116 views
1

對鏈表進行排序,直接交換值或更改下一個指針的地址會更好。對C中的鏈表進行排序(選擇排序)

我碰到使用swaping值技術的例子很多,但使用沒有地址變化機制

方法使用:選擇排序

有沒有辦法通過更改指針

的地址做

回答

0

鏈接列表通常根據指針進行交換。這是因爲每個元素可能太大而不能交換,並且可能發生鏈表中的元素被重載。

例如:

struct myelement 
{ 
    linked_list ll; 
    lot_of_data; 
} 

交換指針使您能夠交換任何類型的過載絲毫鏈表whitout知道有大小的元素。

0

嗯,這是可能的:

struct node { 
int val; 
struct node *next; 
}; 

void sort(struct node **list) { 
if (!*list) return; 
struct node **minadr=list,*cur=*list; 
int min=(*list)->val; 
while (cur) { 
    if (cur->val<min) { 
    min=cur->val; 
    minadr=&(cur->next); 
    } 
    cur=cur->next; 
} 
if (minadr!=list) { 
    cur=*minadr; 
    *minadr=*list; 
    *list=cur; 
} 
sort(&((*list)->next)); 
} 
1

交換指針始終是最好。原因在於,對於鏈表,數據結構包含任意數據,並且必要時包含指向下一個節點的指針。因此,在交換中,僅複製指針比複製指針和數據更有效。

0

交換實際值也可以完成。但是,你可能會搞砸,特別是如果列表很大或者每個節點都有很多字段的話。您最終可能會交換幾個字段,並將其餘字段保持不變而導致不一致。它更好地使用指向節點的指針來避免所有這些,並且像asaelr建議的那樣非常簡單。