0

したがって、構造体の2つの文字列の最初の文字を比較して、一方が他方よりも大きいかどうかを確認する必要がある次の問題があります。これの目的は、構造を順序付けできるようにバブルソート アルゴリズムを実装することです。これまでのところ、私はこの行に来ました:

if(strcmp(j->name,j->proximo->name)>0)

しかし、この行は文字列のすべてのコンテンツを比較します。両方の最初の文字だけが必要です。

完全なコードは次のとおりです

struct s_Especialidade{
    int id;
    char nome[60];
    char descricao[60];
    struct s_Especialidade *proximo;
};

void ordenarMedicoN(){
    PESPECIALIDADE i = malloc ( sizeof(Especialidade));
    PESPECIALIDADE j = malloc ( sizeof(Especialidade));
    PESPECIALIDADE t = malloc ( sizeof(Especialidade));
    for(i=cabecaEspecialidade; i->proximo != NULL; i=i->proximo) {
        for(j=cabecaEspecialidade; j->proximo != NULL; j=j->proximo) {
            if(strcmp(j->nome[0],j->proximo->nome[0])>0) {
                t = j;
                j = j->proximo;
                j->proximo = t;
            }
        }
    }
    main();
}
4

2 に答える 2

1

あなたのコードはメモリをリークしています。

最初に を実行してmalloc()から、別のアドレスを同じポインタに割り当てると、 によって割り当てられたメモリへの参照が失われmalloc()ます。

また、qsort()標準ライブラリを使用して並べ替えを行うことを検討してください。適切な比較関数を作成すると、任意の配列を完全に並べ替えることができ、おそらくアルゴリズムよりも高速になります。

また、すでに作成およびデバッグされています。

于 2013-06-15T19:40:47.663 に答える
0

現在のコード構造を考えると、比較を次のように変更する必要があります。

if( j->nome[0][0] > j->proximo->nome[0][0] )

このコード スニペットは、両方の文字列の最初の文字 (C は 0 から数えることを思い出してください) の ASCII 値を比較します。

ただし、次の注意事項に注意してください。

  • 比較は ASCII レベルで行われます。つまり、大文字と小文字が連続していません。
  • j->proximoNULL でないことを確認するチェックを挿入する必要があります。そうしないと、コードでセグメンテーション違反が発生します。
  • 他の人が述べたように、malloc の呼び出しは不要のようです。つまり、 を実行するときj = j->proximoは、構造体の内容をコピーするのではなく、ポインターを更新するだけです。
于 2013-06-15T20:05:10.953 に答える