Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,如何按优先级对列表项进行排序?_C_Sorting - Fatal编程技术网

在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;