Я пытаюсь упорядочить данные связанного списка по имени, поэтому я сравниваю каждое имя узла со следующим. и да хотят поменять местами данные узлов, чтобы иметь связанный список, упорядоченный по имени.
Я пытался поменять местами все данные узла в случае, если тест в функции "trier" верен, тест равен (strcmp(prec, ptr) < 0)
. кажется, работает хорошо до последнего.
#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);
printf("Saisir annee de naissance de Patient: ");
scanf("%d", &tete->annee);
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);
printf("Saisir annee de naissance de Patient: ");
scanf("%d", &ptr->annee);
ptr->suivant = tete;
tete = ptr;
printf("\nVoulez vous Saisir un autre Patient ?: (O,N): \n");
scanf(" %c", &rep);
}
}
void echangedeNom(struct patient *x, struct patient *y) {
char temp[8];
strcpy(temp, y->nom);
strcpy(y->nom, x->nom);
strcpy(x->nom, temp);
}
void echangedePrenom(struct patient *x, struct patient *y) {
char temp[8];
strcpy(temp, y->prenom);
strcpy(y->prenom, x->prenom);
strcpy(x->prenom, temp);
}
void echangedesentiers(struct patient *x, struct patient *y) {
int temp = 0;
temp = y->cin;
y->cin = x->cin;
x->cin = temp;
}
void echangedesannes(struct patient *x, struct patient *y) {
int temp = 0;
temp = y->annee;
y->annee = x->annee;
x->annee = temp;
}
void printtList() {
struct patient *temp = tete;
while (temp != NULL) {
printf("Cin: %d | Nom:%s | Prenom: %s |Anne de naissance: %d\n",
temp->cin, temp->nom, temp->prenom, temp->annee);
temp = temp->suivant;
}
}
void trier() {
struct patient *ptr = tete;
struct patient *prec = NULL;
int echange;
do {
echange = 0;
while (ptr != NULL && ptr->suivant != NULL) {
prec = ptr;
ptr = ptr->suivant;
if (strcmp(prec->nom, ptr->nom) < 0) {
echangedeNom(prec, ptr);
echangedePrenom(prec, ptr);
echangedesentiers(prec, ptr);
echangedesannes(prec, ptr);
echange = 1;
}
}
} while (echange == 1);
}
int main() {
creationdePatient();
printtList();
trier();
printf("=======================\n");
printtList();
}
некоторые данные во время обмена получают неверную информацию, например, число cin
после замены больше не совпадает.