尝试交换节点数据

时间:2019-04-06 21:10:59

标签: c

我试图按名称排列链接列表数据,所以我将每个节点名称与下一个节点名称进行比较。是的,想要交换节点数据,以按名称排列链接列表。

如果功能“ trier”中的测试为true,则测试为(strcmp(prec, ptr) < 0),我尝试过交换节点的每个数据。直到最后一个似乎运作良好。 enter image description here

#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号不再相同。

1 个答案:

答案 0 :(得分:2)

您在这里交换两次整数:

while(ptr!=NULL && ptr->suivant!=NULL){
    // [...]
    echangedesentiers(prec,ptr);
    echangedesentiers(prec,ptr);
    // [...]
}

顺便说一下,这是学习调试代码的第一步: How to debug small programs