如何按C中的优先级对列表项进行排序?

时间:2012-06-22 17:16:24

标签: c sorting

我希望按用户键入的优先级对列表项进行排序,并且效果很好。但是,当有多个具有相同优先级的项目时,它不按照它应该的到达顺序对它们进行排序。

我很抱歉,如果我不清楚这一点,那么你可以理解。变量的名称是葡萄牙语,所以如果您不理解,请询问。

以下是代码:

typedef struct pedido pedido, *ppedido;

struct pedido{
    char id[5];
    int prioridade;
    int mesa, n_pratos;
    struct prato *prato[TAM];
    ppedido prox;
};

struct prato{
    char id[5];
};

ppedido novo_pedido(ppedido lista)
{
    ppedido novo, aux, anterior = NULL;
    int i;

    novo = (struct pedido*)malloc(sizeof(pedido));

    if(novo == NULL){
        printf("Erro na alocacao de memoria...\n");
        return;
    }

    printf("Number of menus: ");
    scanf("%d", &novo->n_pratos);

    printf("Table number: ");
    scanf("%d", &novo->mesa);

    printf("Priority of request? ");
        scanf("%d", &novo->prioridade);

        printf("Introduza o ID do pedido: ");
        scanf("%s", &novo->id);

    for(i=0;i<novo->n_pratos;i++){
        printf("ID of menu %d: ", i+1);  //something like "M1, M4..." doesn't matter
        scanf("%s", &novo->prato[i]);
        fflush(stdin);
    }

    novo->prox=NULL;

    if(lista == NULL || novo->prioridade > lista->prioridade) { 
        novo->prox = lista; 
        lista = novo; 
    }
    else
    { 
        aux = lista;

        while(aux != NULL && novo->prioridade < aux->prioridade)   //this is where it should be sort requests by their priority and order of arrival
            aux = aux->prox; 
        novo->prox = aux->prox; 
        aux->prox = novo;
    }
    return lista;
}

3 个答案:

答案 0 :(得分:0)

我发布的代码中没有看到任何排序,但大多数排序算法都不稳定。这意味着它们通常不会保留被视为“相等”的元素的顺序。

您需要切换到稳定排序,或者更改比较功能,以便在优先级相等时考虑“到达时间”。

答案 1 :(得分:0)

我想你想改变这个:

while(aux != NULL && novo->prioridade < aux->prioridade)

要:

while(aux->prox != NULL && novo->prioridade <= aux->prox->prioridade)

通过这种方式,它将超过所有具有相同优先级的并且更接近列表的末尾。当您遍历到列表末尾时,这将保留对aux的引用。

我认为在您的搜索中,您会在找到最高优先级后立即停止。

这假定进入列表的顺序与到达顺序相同。

答案 2 :(得分:0)

因此,假设我们有优先级,项目元组(priority, item)item是我们示例的字符。

NULL

列表开始为null。我们开始插入。

(1, x)
NULL

...

(3, z)
(2, y)
(1, x)
NULL

现在我们插入(0, a)

if评估为false,aux = lista指向(3, z)

while前进aux指向NULL

然后:

    novo->prox = aux->prox; 
    aux->prox = novo;

auxNULL

至于到货订单,您是指在函数调用方面的到货订单,还是作为数据一部分的其他到货订单?