Это неправильно, что я делаю в функции «trier», которая меняет местами имя пациента?

#c

#c

Вопрос:

Упражнение по созданию связанного списка для пациентов, затем упорядочьте его по их имени. Я пытаюсь поменять местами их имена; похоже, то, что я сделал, не работает.

Я попытался взять предыдущий указатель «prec» и сравнить имя следующего указателя «ptr», затем я попытался поменять местами их имена в функции с именем «echangedeChaine».

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

struct patient{
    int cin;
    char nom[8];
    char prenom[8];
    int annee;
    struct patient *suivant;
};

struct patient *tete=NULL;

void creationdePatient(){
    struct patient* ptr;
    char rep;

    ptr = malloc(sizeof(struct patient));
    tete =ptr;
    printf("Saisir Numero de Cin de Nouveau Patient: ");
    scanf("%d",amp;tete->cin);
    printf("Saisir Nom de Patient: ");
    scanf("%8s",amp;tete->nom);
    printf("Saisir prenom de Patient: ");
    scanf("%8s",amp;tete->prenom);
    tete->suivant = NULL;
    printf("nVoulez vous Saisir un autre Patient ?: (O,N): n");
    scanf(" %c",amp;rep);

    while(toupper(rep)=='O'){
        ptr = malloc(sizeof(struct patient));
        printf("Saisir Numero de Cin de Nouveau Patient: ");
        scanf("%d",amp;ptr->cin);
        printf("Saisir Nom de Patient: ");
        scanf("%8s",amp;ptr->nom);
        printf("Saisir prenom de Patient: ");
        scanf("%8s",amp;ptr->prenom);
        ptr->suivant = tete;
        tete=ptr;
        printf("nVoulez vous Saisir un autre Patient ?: (O,N): n");
        scanf(" %c",amp;rep);
    }
}

void echangedeChaine(char x[8] , char y[8]){
    char temp[8];
    strcpy(temp,y);
    strcpy(y,x);
    strcpy(x,temp);
}


void printtList(){
    struct patient *temp = tete;

    while(temp!=NULL){
        printf("Cin: %d | Nom:%s | Prenom: %sn", temp->cin, temp->nom, temp->prenom);
        temp=temp->suivant;
    }
}


void trier(){
    struct patient *ptr = tete;
    struct patient*prec;
    int echange=0;
    do{
        while(ptr!=NULL){
            prec=ptr;
            ptr=ptr->suivant;
            if(strcmp(prec->nom,ptr->nom)<0){
                echangedeChaine(prec->nom,ptr->nom);
                echange=1;
            }
        }
    }while(echange==1);
}

int main()
{
   creationdePatient();
   printtList();
   trier();
   printtList();
}
  

Кажется, это не работает после того, как я попытался его выполнить.

Комментарии:

1. Что именно вы видите?

2. У вас ужасное вопиющее повторение в creationdePatient() ; вы должны установить char rep = 'O'; и иметь только код цикла, а не код перед ним. Избегать подобных повторений — всегда хорошее упражнение.

3. хорошо, приятель, спасибо

4. echangedeChaine должен быть закодирован путем замены двух строковых указателей, а не содержимого! намного эффективнее… но это также означает использование указателей в структуре и их правильную инициализацию

5. вы имеете в виду замену указателя, а не содержимого?

Ответ №1:

В вашем коде есть несколько проблем, в том числе (но не обязательно ограничиваясь):

  1. Ваш код в trier() будет разыменовывать нулевой указатель на последний элемент — поскольку его suivant значение равно NULL, и вы делаете:

     ptr = ptr->suivant;
    if(strcmp(prec->nom,ptr->nom) < 0) { ... }
      
  2. Я думаю, вы пытаетесь выполнить сортировку в неправильном порядке: когда strcmp(prec->nom,ptr->nom) значение отрицательное, это означает, что имя первого пациента лексикографически предшествует имени следующего пациента — в этом случае их не следует заменять.


PS — для тех, кто не владеет французским, вот небольшой глоссарий для программы OP…

tete = head
suivant = next
nom = фамилия / семейное имя
prenom = имя по имени
echange = изменить (или заменить)
chaine = список (или cain)

Комментарии:

1. можете ли вы порекомендовать, как я могу это исправить?

2. Да, измените условие цикла на ptr != NULL amp;amp; ptr->suivant != NULL .

3. это работало хорошо, пока я не попытался поменять местами другие поля записи

4. Другой код — другой вопрос. Но, пожалуйста, задайте его с образцами ввода и вывода, чтобы люди могли воспроизвести.