1

ユーザーが入力した優先度でリスト項目を並べ替えたいのですが、それはうまくいきます。ただし、同じ優先度のアイテムが複数ある場合、本来のように到着順にソートされません。

あなたが理解できるように私がこれを十分に明確にしていない場合は申し訳ありません. 変数名はポルトガル語なので、わからないことがあれば聞いてください。

コードは次のとおりです。

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;
}
4

3 に答える 3

0

優先順位があり、アイテムタプルが(priority, item)ありitem、例のキャラクターであるとしましょう。

NULL

リストは null で始まります。挿入を開始します。

(1, x)
NULL

...

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

を挿入し(0, a)ます。

iffalse と評価され、 をaux = lista指し(3, z)ます。

はを指すwhileまで進みます。auxNULL

それで:

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

しかしauxですNULL

到着順とは、関数の呼び出しに関する到着順、またはデータの一部であるその他の到着順を意味しますか?

于 2012-06-22T17:38:43.450 に答える
0

投稿されたコードで並べ替えが行われているとは思いませんが、ほとんどの並べ替えアルゴリズムは安定していません。これは、通常、「等しい」と見なされる要素の順序を保持しないことを意味します。

安定した並べ替えに切り替えるか、比較関数を変更して、優先度が等しい場合に「到着時間」を考慮する必要があります。

于 2012-06-22T17:32:02.847 に答える
0

これを変更したいと思います:

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

に:

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

このようにして、同じ優先度のものをすべて通過し、リストの最後に近づけます。これにより、リストの最後までトラバースするときに aux への参照が保持されます。

検索では、優先度が最も高いものを見つけたらすぐに停止すると思います。

これは、リストへのエントリの順序が到着の順序と同じであることを前提としています。

于 2012-06-22T17:38:26.677 に答える