在C语言中,如何按优先级对列表项进行排序?
我想按用户输入的优先级对列表项进行排序,它做得很好。但是,当有多个项目具有相同的优先级时,它不会像预期的那样按到达顺序对它们进行排序 如果我说得不够清楚,让你能理解,我很抱歉。变量的名称是葡萄牙语的,所以如果你不懂一些东西,请询问 代码如下:在C语言中,如何按优先级对列表项进行排序?,c,sorting,C,Sorting,我想按用户输入的优先级对列表项进行排序,它做得很好。但是,当有多个项目具有相同的优先级时,它不会像预期的那样按到达顺序对它们进行排序 如果我说得不够清楚,让你能理解,我很抱歉。变量的名称是葡萄牙语的,所以如果你不懂一些东西,请询问 代码如下: typedef struct pedido pedido, *ppedido; struct pedido{ char id[5]; int prioridade; int mesa, n_pratos; struct p
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;
}
typedef结构pedido pedido,*ppedido;
佩迪多结构{
字符id[5];
内普里奥里达德;
int mesa,n_pratos;
结构prato*prato[TAM];
佩迪多prox;
};
普拉托结构{
字符id[5];
};
新佩迪多酒店(佩迪多酒店)
{
ppedido novo,aux,前=NULL;
int i;
novo=(结构pedido*)malloc(sizeof(pedido));
如果(novo==NULL){
printf(“记忆中的错误…\n”);
返回;
}
printf(“菜单数量:”);
scanf(“%d”,&novo->n_pratos);
printf(“表号:”);
scanf(“%d”、&novo->mesa);
printf(“请求的优先级?”);
scanf(“%d”,&novo->prioridade);
printf(“引见我做佩蒂多:”);
scanf(“%s”,&novo->id);
对于(i=0;in_pratos;i++){
printf(“菜单%d的ID:,i+1);//类似“M1,M4…”的内容并不重要
scanf(“%s”,&novo->prato[i]);
fflush(stdin);
}
novo->prox=NULL;
如果(lista==NULL | | novo->prioridade>lista->prioridade){
novo->prox=lista;
lista=novo;
}
其他的
{
aux=lista;
while(aux!=NULL&&novo->prioridadeprioridade)//这是按优先级和到达顺序对请求排序的地方
辅助=辅助->前置;
novo->prox=aux->prox;
aux->prox=novo;
}
返回列表a;
}
我看不到您发布的代码中有任何排序,但大多数排序算法都不稳定。这意味着它们通常不会保持被视为“相等”的元素的顺序
你需要切换到一个稳定的排序,或者改变你的比较函数,考虑优先级相等时的“到达时间”。
< P>我想你要改变这个:while(aux != NULL && novo->prioridade < aux->prioridade)
while(aux!=NULL&&novo->prioridadeprioridade)
致:
while(aux->prox!=NULL&&novo->prioridade prox->prioridade)
通过这种方式,它将超越所有具有相同优先级的项目,并更接近列表的末尾。这将在遍历到列表末尾时保留对aux的引用
我想在你的搜索中,一旦你找到最高优先级,你就会停止
这假设进入列表的顺序与到达顺序相同。因此,假设我们有优先级,项元组
(优先级,项)
,并且项是我们示例中的一个字符
NULL
列表开始为空。我们开始插入
(1, x)
NULL
现在我们插入(0,a)
如果的计算结果为false,aux=lista
指向(3,z)
while
前进,直到aux
指向NULL
然后:
但是aux
是NULL
至于到达顺序,您指的是函数调用的到达顺序,还是数据中的其他到达顺序?您的代码应该如何知道什么时候到达?我询问请求的详细信息,它会将它们放在列表中,当再次调用函数时,列表中已经有了一些内容。所以,在第一个菜单之后询问的菜单应该在它之后的位置,对吗?我的意思是在函数调用方面。你想要后进先出还是先进后出?
(1, x)
NULL
(3, z)
(2, y)
(1, x)
NULL
novo->prox = aux->prox;
aux->prox = novo;