C:列表排序代码不起作用

时间:2016-06-29 14:47:14

标签: c list sorting bubble-sort

我无法弄清楚为什么我的代码对列表元素进行排序不起作用,它对列表的前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;
}

}

2 个答案:

答案 0 :(得分:0)

当您进行交换时,如果corrl->head,则您需要将l->head重置为succ。如果你没有,那么下次循环时,排序将从第一次传递后l->head结束的任何地方开始。

此外,您将丢失(并泄漏)列表的一部分。

编辑:更多来自评论

它通常适用于corr之前的元素(交换时需要重置为succ

答案 1 :(得分:0)

没有必要分配elem_t的实例。交换元素时,如果其中一个元素是列表中的第一个元素,或者元素是相邻元素,则会出现问题。使用指向元素的指针可以减少if语句的数量。指向指针的指针可以是头的地址或节点下一个指针的地址。

要实现交换,首先将任意点交换到两个节点(可能是头部或节点下一个指针),然后交换两个节点的下一个指针。这将处理相邻节点与非相邻节点问题。