对链表进行排序,直接交换值或更改下一个指针的地址会更好。对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建议的那样非常简单。