2010-12-08 16 views
2

うわー今私は知りません。笑。フィールドの1つで構造体のリンクリストをソートするにはどうすればよいですか?

私はこのように私の構造を持っている:

struct Medico{ 
int Id_Doctor; 
int Estado; 
char Nombre[60]; ////focus on this part of the structure, this is name. 
char Clave_Acceso[20]; 
char Especialidad[40]; 
struct Medico *next; 
}; 

そして私は、構造体の名前に応じて、(アルファベット順。)この問題に取り組むための方法上の任意のアイデアを整理したいですか?例

Albert Haynesworth 
Bob Marley 
Carl Johnson 

ため

は高度にありがとうございました。 :)(C、Unix)

+0

あなたが注文したいこれらの構造の配列を持っているように思えますか? Medicoアイテムの配列をとり、Medico - > Nombreで並べ替えるソートメソッドを作成しないでください – Prescott

+1

何を求めていますか? 2つの文字列を比較するには?並べ替える方法?リンクされたリストの要素を移動するには? –

+0

@Nathan 構造上にたくさんのユーザーがいて、名前のアルファベット順に表示したいと思っています。私はそれを行う方法についていくつかの助けを求めています。 – drodri420

答えて

1

は非常に簡単です:あなたは、データ構造と右の比較を使用するには、このコードを変更する必要があります

#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 

struct node { 
    struct node *next; 
    char *data; 
}; 

struct node * 
divlist (struct node *n) { 
    int i = 0; 
    if (n) { 
     struct node *tail, *n2 = n; 
     while (1) { 
      n2 = n2->next; 
      if (!n2) break; 
      if (i++ & 1) n = n->next; 
     } 
     tail = n->next; 
     n->next = NULL; 
     return tail; 
    } 
    return NULL; 
} 

struct node * 
mergelists(struct node *a, struct node *b) { 
    struct node *n; 
    struct node **last = &n; 
    if (!a) return b; 
    if (!b) return a; 

    while (1) { 
     if (strcmp(a->data, b->data) > 1) { 
      *last = b; 
      last = &b->next; 
      b = b->next; 
      if (!b) { 
       *last = a; 
       break; 
      } 
     } 
     else { 
      *last = a; 
      last = &a->next; 
      a = a->next; 
      if (!a) { 
       *last = b; 
       break; 
      } 
     } 
    } 
    return n; 
} 

struct node * 
sortlist (struct node *n) { 
    struct node *tail = divlist(n); 
    if (!tail) return n; 
    return mergelists(sortlist(n), sortlist(tail)); 
} 

int main(int argc, char *argv[]) { 
    int i; 
    struct node *n1, *n = NULL; 
    for (i = argc; --i >= 1;) { 
     n1 = (struct node *)malloc(sizeof(*n1)); 
     n1->data = argv[i]; 
     n1->next = n; 
     n = n1; 
    } 

    n1 = n = sortlist(n); 

    while (n1) { 
     printf("%s\n", n1->data); 
     n1 = n1->next; 
    } 
    return 0; 
} 

注意!

0

構造体の配列をソートする場合はqsort関数を使用できます。man qsortを参照してください。それは、配列要素の数、要素の大きさや機能を比較のベースアドレスを取ります。

int compare(const void *a, const void *b) { 
    Medico *medA = (Medico*) a; 
    Medico *medB = (Medico*) b; 
    return /* compare medA and medB */; 
} 

Medico *medicos = /* initialize */; 
qsort(medicos, numberOfMedicos, sizeof(Medico), compare); 

D'ああ、ちょうど今、私はおそらく、この答えは無用になり、次のレコードポインタを気づきました。 (私はリンクリストが明らかに作るために、質問のタイトルを変更しました。)この回答から、少なくとも何かを作るために、あなたは常に配列にリストをコピーすることができます:もちろん

Medico *medicos = calloc(sizeof(Medico), numberOfMedicos); 
Medico *current = /* first record in your linked list */; 
int i = 0; 

assert(current); 
do { 
    medicos[i++] = *current; 
    current = current->next; 
} while (current); 

// Here you can sort the array. 

free(medicos); 

、それは数に依存しますレコードおよびその他の変数の

(私のCは少しさびで、修正すること自由に感じています。)

+0

それは人生のように思えました、私は次の4時間前にこれを必要としています... 2.33と私が必要とする最後のものの1つ.../ – drodri420

+0

あなたの2番目の答えはきれいに見えます。私が何を思いついたか教えてください。ありがとう – drodri420

1

Cがあなたのために並べ替え、またソートされたデータ構造を維持することはできません。他の人が示唆しているように、あなたはそれを自分で分類する必要があります。リンクされたリストに挿入するのは簡単なので、新しいMedicoを作成するときにこれを実行します。反復するときに、それが所属する場所を見つけることができます。

メディコの注文が異なる必要がある場合は、それを表示するたびにソートする必要があります。おそらく、すべての名前を取り出して、結果の配列をいくつかの手法(サイズに応じて)のいずれかを使って並べ替えることを繰り返したいと思うでしょう。

リストの順序が問題ではないと仮定すると、順番にそれを保管してください。

+0

ユーザーのID(Id_Doctor)に従って一覧表示されているので、リストは既に特定の順序になっています。 – drodri420

+0

次に、以下で述べるように、id_doctorソートされたリストから名前を配列にコピーし、ソートする必要があります。以下に、名前をコピーして配列をソートするためのコードをいくつか示します。 zoulのコードはこの目的のためにうまくいくはずです – Robert

1

quicksortまたはmergesortのいずれかの実装を見たいと思うように聞こえます。私はc std lib qsortの実装は配列であり、リンクされたリストではないので、あなた自身で実装する必要があるかもしれないと思っています(私はあなたが簡単な検索をした場合にinterwebz上で容易に利用可能な実装)Cでのリンクリストの上にマージソートの実装

+0

私は自分のソリューションを実装しなければならないことを知っています、問題はどうですか...私は文字列として名前を保存し、次にこれの情報を比較し、リストの上にいる人の情報など... – drodri420

+1

投稿されたリンクの情報を読んでください。彼らはどちらも擬似コードの実装を持っています - それをcに変換するのは難しいはずはありません –

関連する問題