2010-12-08 7 views
2

와우 지금 나는 모른다. Lol.필드 중 하나를 사용하여 구조체의 연결된 목록을 정렬하는 방법은 무엇입니까?

나는이처럼 내 구조를 가지고 :

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

무엇을 묻고 있습니까? 두 문자열을 비교하는 방법? 어떻게 정렬합니까? 연결된 목록에서 요소를 이동하는 방법? –

+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 참조). 그것은, 요소, 요소 크기의 수와 비교하는 기능을 배열의 기본 주소를 취 D' 오, 지금 내가 아마 대답은 쓸모하게 다음 레코드 포인터를 발견

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

. (필자는 연결리스트가 분명하게 질문 제목을 변경했습니다.)이 답변에서 적어도 뭔가를하려면, 당신은 항상 배열로 목록을 복사 할 수 있습니다 : 물론

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과 내가 필요로하는 마지막 것 중 하나 ... :/ – drodri420

+0

두 번째 대답은 꽤 깔끔하고, 아프고 내가 무엇을 생각해 내는지 말해 주렴. 덕분에 – drodri420

1

C가 당신을 위해 정렬이나 정렬 된 데이터 구조를 유지할 수 없습니다. 다른 사람들이 제안했듯이, 당신 스스로 그것을 분류 할 필요가 있습니다. 링크드리스트에 삽입하는 것이 쉽기 때문에 새로운 Medico를 만들 때이 작업을 수행 할 것입니다. 그리고 반복 할 때 어디에 속해 있는지 찾을 수 있습니다.

Medico의 주문이 다를 경우, 표시 할 때마다 목록을 정렬해야합니다. 아마도 모든 이름을 추출하고 크기에 따라 다양한 기법을 사용하여 결과 배열을 정렬하는 작업을 반복 할 수 있습니다.

목록 순서가 문제가되지 않는다고 가정 할 때 순서대로 보관하십시오.

+0

목록은 사용자의 ID (Id_Doctor)에 따라 나열된대로 특정 순서로 이미 있습니다. – drodri420

+0

그러면 아래에서 언급했듯이 id_doctor 정렬 목록에서 이름을 배열로 복사하고 정렬해야합니다. 이름을 복사하고 배열을 정렬하려면 아래에 몇 가지 코드가 있습니다. zoul의 코드는이 목적을 위해 잘 작동해야합니다. – Robert

1

quicksort 또는 mergesort 중 하나를 구현하고자하는 것처럼 들릴 것입니다. 나는 c std lib qsort 구현이 배열과 연결리스트를 취하지 않기 때문에 직접 구현해야 할 수도 있다고 생각한다. (비록 빠른 검색을했다면 interwebz에서 쉽게 사용할 수있는 구현을 찾을 수 있다고 확신하지만) C에서 연결된 목록을 통해 머지 소트를 구현

+0

내 자신의 솔루션을 구현해야한다는 것을 알고 있습니다. 문제는 ... 어떻게 시작하겠습니까? 이름을 문자열로 저장 한 다음이 정보를 비교하고 다음을 찾습니다. 정보의 목록에있는 사람의 정보 등등 ... – drodri420

+1

게시 된 링크 정보를 읽으십시오. 그들은 둘 다 가상 코드 구현을 가지고 있습니다 - c로 변환하기가 너무 어려워서는 안됩니다. –

관련 문제