【问题标题】:C: List sort code not workingC:列表排序代码不起作用
【发布时间】:2016-11-01 08:44:31
【问题描述】:

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

}

【问题讨论】:

  • 在目前的形式中,这是一个“为什么这段代码不起作用”类型的问题,应该作为题外话关闭。您是否尝试在调试器中运行代码以查看其停止的原因?

标签: c list sorting bubble-sort


【解决方案1】:

在交换时,如果corrl->head,则需要将l->head 重置为succ。如果您不这样做,那么下一次循环时,排序将从第一次通过后 l->head 结束的任何位置开始。

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

编辑:来自 cmets 的更多内容

一般适用于corr的前一个元素(交换时需要重置为succ

【讨论】:

  • 对不起,我无法理解。 corr 是 l->head 在内部循环的开头,然后它更改为列表的下一个元素,依此类推.. 之后我在每个 while 开头重置 corr=l->head(scambio==1 ) 环形。我错过了什么?
  • 我明白你在说什么,我添加了“if (corr==l->head) l->head=succ;”在内循环的开头,但它不会改变任何东西。
  • 不仅如此——当你交换 corr 和 succ 时,曾经指向 corr 的元素需要将其下一个设置为 succ。我指出了l->head的情况,但它一般适用于corr的前一个元素(交换时需要重置为succ)
【解决方案2】:

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

要实现交换,首先交换指向两个节点的任何内容(可以是 head 或节点 next 指针),然后交换两个节点的 next 指针。这将解决相邻节点与非相邻节点的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    相关资源
    最近更新 更多