我希望按用户键入的优先级对列表项进行排序,并且效果很好。但是,当有多个具有相同优先级的项目时,它不按照它应该的到达顺序对它们进行排序。
我很抱歉,如果我不清楚这一点,那么你可以理解。变量的名称是葡萄牙语,所以如果您不理解,请询问。
以下是代码:
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;
}
答案 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;
但aux
为NULL
。
至于到货订单,您是指在函数调用方面的到货订单,还是作为数据一部分的其他到货订单?