Это неправильно, что я делаю в функции «trier», которая меняет имя пациента? - PullRequest
0 голосов
/ 06 апреля 2019

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

Я попытался взять предыдущий указатель "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",&tete->cin);
    printf("Saisir Nom de Patient: ");
    scanf("%8s",&tete->nom);
    printf("Saisir prenom de Patient: ");
    scanf("%8s",&tete->prenom);
    tete->suivant = NULL;
    printf("\nVoulez vous Saisir un autre Patient ?: (O,N): \n");
    scanf(" %c",&rep);

    while(toupper(rep)=='O'){
        ptr = malloc(sizeof(struct patient));
        printf("Saisir Numero de Cin de Nouveau Patient: ");
        scanf("%d",&ptr->cin);
        printf("Saisir Nom de Patient: ");
        scanf("%8s",&ptr->nom);
        printf("Saisir prenom de Patient: ");
        scanf("%8s",&ptr->prenom);
        ptr->suivant = tete;
        tete=ptr;
        printf("\nVoulez vous Saisir un autre Patient ?: (O,N): \n");
        scanf(" %c",&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: %s\n", 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 Ответ

1 голос
/ 06 апреля 2019

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

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

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


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

тет = голова
suivant = следующий
ном = фамилия / фамилия
prenom = имя / имя
echange = изменить (или заменить)
Chaine = список (или Cain)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...