Попытка поменять местами данные узлов

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

Я попытался поменять местами данные одного узла с другим, если тест в функции «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 после обмена уже не то же самое.

относительно: scanf("%8s", &tete->prenom); 1) Поле: prenom имеет длину всего 8 байт. Спецификатор формата ввода: %s всегда добавляет байт NUL к вводу, поэтому «%8s» может позволить вводу переполнить входной буфер. Предложите "%7s" 2) всегда проверять возвращаемое значение (а не значения параметров), чтобы убедиться, что операция прошла успешно. Примечание: возвращаемое значение представляет собой количество успешных преобразований ввода (или EOF). Предложение: if ( scanf("%7s", &tete->prenom) != 1) { // handle error } Аналогичные соображения существуют для других вызовов scanf()

user3629249 07.04.2019 23:11

относительно: scanf("%8s", &ptr->nom) в C ссылка на массив ухудшается до адреса первого байта массива. char * ptr->nom[8] приводит к тому, что компилятор выводит:: :27:14: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[8]’ [-Wformat=] Предложение: удаление ведущего '&'

user3629249 07.04.2019 23:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь вы дважды меняете целое число:

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

Кстати, вот первый шаг к тому, чтобы научиться отлаживать свой код: Как отлаживать небольшие программы.

я отредактировал его, вы можете проверить следующий выпуск, спасибо, кстати.

Ayoub Souid 06.04.2019 23:28

@AyoubSouid, лучший способ - научиться отлаживать программу, которую вы пишете. Также, пожалуйста, проверьте эту страницу о цели StackOverflow: stackoverflow.com/help/on-topic

Amessihel 07.04.2019 01:19

Другие вопросы по теме