我试图按名称排列链接列表数据,所以我将每个节点名称与下一个节点名称进行比较。是的,想要交换节点数据,以按名称排列链接列表。
如果功能“ trier”中的测试为true,则测试为(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
号不再相同。
答案 0 :(得分:2)
您在这里交换两次整数:
while(ptr!=NULL && ptr->suivant!=NULL){
// [...]
echangedesentiers(prec,ptr);
echangedesentiers(prec,ptr);
// [...]
}
顺便说一下,这是学习调试代码的第一步: How to debug small programs 。