c中链表的选择排序
selection sorting of a linked list in c
我正在为 C 中的单向链表尝试不同的排序技术。但是,我一直坚持使用指针重排方法进行选择排序。
到目前为止,这是我的代码
typedef struct node {
int data;
struct node *next;
} Node;
void llselectionsort(Node *head) {
Node *marker, *cur = NULL, *min;
for(marker = head; marker != NULL; marker = marker->next){
min = marker;
for(cur = marker->next; cur != NULL; cur = cur->next){
if(cur->data < min->data) {
min = cur;
}
}
Node *tmp = marker;
marker = min;
tmp->next = marker->next;
min->next = tmp;
}
}
我想我使用的指针可能比必要的少了一个,但我仍然不确定。如有任何帮助,我们将不胜感激。
(注意:我知道选择排序被认为是低效的,但是我想了解如何实现它而不管较小的列表排序)
如果使用双指针,这将更容易实现:
NODE * SortList(NODE * pList)
{
NODE **ppNew = &pList; /* used to traverse sorted list */
NODE **ppSml; /* ptr to ptr to smallest node */
NODE **ppCur; /* head or previous node */
NODE *pCur; /* current node */
NODE *pTmp;
if(pList == NULL) /* check for NULL list */
return(pList);
while((*ppNew)->next != NULL){ /* while not at end list */
ppSml = ppNew; /* find smallest node */
ppCur = &((*ppNew)->next);
while(NULL != (pCur = *ppCur)){
if(pCur->data < (*ppSml)->data)
ppSml = ppCur;
ppCur = &((*ppCur)->next);
}
/* for adjacent nodes, 3 pointers are rotated and the order of swaps matters */
if(*ppNew != *ppSml){ /* if not the same node */
pTmp = *ppNew; /* swap node ptrs */
*ppNew = *ppSml;
*ppSml = pTmp;
pTmp = (*ppNew)->next; /* swap next ptrs */
(*ppNew)->next = (*ppSml)->next;
(*ppSml)->next = pTmp;
}
ppNew = &((*ppNew)->next); /* advance ppNew */
}
return(pList);
}
您代码的最后四行可以更改为:
int tmp=marker->data;
标记数据=最小->数据;
min->data=tmp;
希望能帮助到你。
我正在为 C 中的单向链表尝试不同的排序技术。但是,我一直坚持使用指针重排方法进行选择排序。 到目前为止,这是我的代码
typedef struct node {
int data;
struct node *next;
} Node;
void llselectionsort(Node *head) {
Node *marker, *cur = NULL, *min;
for(marker = head; marker != NULL; marker = marker->next){
min = marker;
for(cur = marker->next; cur != NULL; cur = cur->next){
if(cur->data < min->data) {
min = cur;
}
}
Node *tmp = marker;
marker = min;
tmp->next = marker->next;
min->next = tmp;
}
}
我想我使用的指针可能比必要的少了一个,但我仍然不确定。如有任何帮助,我们将不胜感激。
(注意:我知道选择排序被认为是低效的,但是我想了解如何实现它而不管较小的列表排序)
如果使用双指针,这将更容易实现:
NODE * SortList(NODE * pList)
{
NODE **ppNew = &pList; /* used to traverse sorted list */
NODE **ppSml; /* ptr to ptr to smallest node */
NODE **ppCur; /* head or previous node */
NODE *pCur; /* current node */
NODE *pTmp;
if(pList == NULL) /* check for NULL list */
return(pList);
while((*ppNew)->next != NULL){ /* while not at end list */
ppSml = ppNew; /* find smallest node */
ppCur = &((*ppNew)->next);
while(NULL != (pCur = *ppCur)){
if(pCur->data < (*ppSml)->data)
ppSml = ppCur;
ppCur = &((*ppCur)->next);
}
/* for adjacent nodes, 3 pointers are rotated and the order of swaps matters */
if(*ppNew != *ppSml){ /* if not the same node */
pTmp = *ppNew; /* swap node ptrs */
*ppNew = *ppSml;
*ppSml = pTmp;
pTmp = (*ppNew)->next; /* swap next ptrs */
(*ppNew)->next = (*ppSml)->next;
(*ppSml)->next = pTmp;
}
ppNew = &((*ppNew)->next); /* advance ppNew */
}
return(pList);
}
您代码的最后四行可以更改为:
int tmp=marker->data;
标记数据=最小->数据;
min->data=tmp;
希望能帮助到你。