我无法弄清楚为什么我的代码对列表元素进行排序不起作用,它对列表的前5个元素进行排序然后停止。我知道这可能是一个愚蠢的问题,但我检查循环很多时间,无法理解为什么它到达列表结束前的退出。
typedef enum { NOTORD=0, TIME=1, POSITION=2 } ord_t;
typedef struct elem {
double position;
double time;
flag_t flag;
struct elem * next;
} elem_t;
typedef struct {
elem_t * head;
int nelem;
ord_t ord;
} lista_t;
void set_ordinata_time (lista_t * l)
{
if (l->ord!=TIME) {
elem_t * aux, *corr, *succ;
int scambio;
corr=l->head;
succ=l->head->next;
aux=malloc(sizeof(elem_t));
scambio=1;
while(scambio==1)
{
corr=l->head;
succ=l->head->next;
scambio=0;
while(succ != NULL)
{
if (corr->time > succ->time)
{
aux=corr;
aux->next=succ->next;
corr=succ;
succ=aux;
corr->next=succ;
scambio=1;
}
corr=succ; succ=succ->next;
}
}
l->ord=TIME;
}
}
答案 0 :(得分:0)
当您进行交换时,如果corr
为l->head
,则您需要将l->head
重置为succ
。如果你没有,那么下次循环时,排序将从第一次传递后l->head
结束的任何地方开始。
此外,您将丢失(并泄漏)列表的一部分。
编辑:更多来自评论
它通常适用于corr
之前的元素(交换时需要重置为succ
)
答案 1 :(得分:0)
没有必要分配elem_t的实例。交换元素时,如果其中一个元素是列表中的第一个元素,或者元素是相邻元素,则会出现问题。使用指向元素的指针可以减少if语句的数量。指向指针的指针可以是头的地址或节点下一个指针的地址。
要实现交换,首先将任意点交换到两个节点(可能是头部或节点下一个指针),然后交换两个节点的下一个指针。这将处理相邻节点与非相邻节点问题。