Попытка сохранить связанный список в алфавитном порядке

#c

#c

Вопрос:

я пытаюсь отсортировать связанный список в алфавитном порядке с помощью функции «trier ()», с помощью которой я пытаюсь сравнить имя каждого узла со следующим.

Я попытался сравнить имена узлов, используя «strcmp», а затем поменять местами их данные. «пациент» — это запись. функции «обмена» предназначены для обмена данными узла.

 void trier(){
  struct patient *ptr = tete;
  struct patient*prec=NULL;
  int echange;

  do{
    echange=0;

    while(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);
  printf("nn Trie Avec Succes ! n");
}
  

это работает для первых 2 узлов, но позже нет.

введите описание изображения здесь

введите описание изображения здесь

Комментарии:

1. вы пропустили сброс ptr в tete , смотрите мой ответ

2. я отредактировал его, посмотри, приятель

3. Выполнено. Спасибо, приятель

Ответ №1:

в

 void trier(){
  struct patient *ptr = tete;
  struct patient*prec=NULL;
  int echange;

  do{
    echange=0;

    while(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);
  printf("nn Trie Avec Succes ! n");
}
  

когда вы завершаете внутреннее while, вы пропустили, чтобы вернуть ptr в начало списка для следующего хода, so ptr->suivant!=NULL равно false и echange остается 0, и вы прекращаете сортировку

может быть :

 void trier(){
  int echange;

  do{
    struct patient *ptr = tete;
    struct patient*prec=NULL;

    echange=0;

    while(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);
  printf("nn Trie Avec Succes ! n");
}
  

Обратите внимание, что другим способом был обмен ячейками, а не обмен их содержимым

Комментарии:

1. и как вернуть его обратно в head? должен ли я вводить ptr = tete? в итоге?

2. @AyoubSouid Я отредактировал свой ответ из вашего отредактированного кода

3. все в порядке <3 спасибо, приятель, что я выполнил ptr = tete после цикла while, как ты сказал, и это работает хорошо, еще раз спасибо