對鏈表進行排序,直接交換值或更改下一個指針的地址會更好。對C中的鏈表進行排序(選擇排序)
我碰到使用swaping值技術的例子很多,但使用沒有地址變化機制
方法使用:選擇排序
有沒有辦法通過更改指針
的地址做對鏈表進行排序,直接交換值或更改下一個指針的地址會更好。對C中的鏈表進行排序(選擇排序)
我碰到使用swaping值技術的例子很多,但使用沒有地址變化機制
方法使用:選擇排序
有沒有辦法通過更改指針
的地址做鏈接列表通常根據指針進行交換。這是因爲每個元素可能太大而不能交換,並且可能發生鏈表中的元素被重載。
例如:
struct myelement
{
linked_list ll;
lot_of_data;
}
交換指針使您能夠交換任何類型的過載絲毫鏈表whitout知道有大小的元素。
嗯,這是可能的:
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));
}
交換指針始終是最好。原因在於,對於鏈表,數據結構包含任意數據,並且必要時包含指向下一個節點的指針。因此,在交換中,僅複製指針比複製指針和數據更有效。
交換實際值也可以完成。但是,你可能會搞砸,特別是如果列表很大或者每個節點都有很多字段的話。您最終可能會交換幾個字段,並將其餘字段保持不變而導致不一致。它更好地使用指向節點的指針來避免所有這些,並且像asaelr建議的那樣非常簡單。