对C中的链表进行排序(选择排序)

问题描述:

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