#c
#c
Вопрос:
Упражнение по созданию связанного списка для пациентов, затем упорядочьте его по их имени. Я пытаюсь поменять местами их имена; похоже, то, что я сделал, не работает.
Я попытался взять предыдущий указатель «prec» и сравнить имя следующего указателя «ptr», затем я попытался поменять местами их имена в функции с именем «echangedeChaine».
#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",amp;tete->cin);
printf("Saisir Nom de Patient: ");
scanf("%8s",amp;tete->nom);
printf("Saisir prenom de Patient: ");
scanf("%8s",amp;tete->prenom);
tete->suivant = NULL;
printf("nVoulez vous Saisir un autre Patient ?: (O,N): n");
scanf(" %c",amp;rep);
while(toupper(rep)=='O'){
ptr = malloc(sizeof(struct patient));
printf("Saisir Numero de Cin de Nouveau Patient: ");
scanf("%d",amp;ptr->cin);
printf("Saisir Nom de Patient: ");
scanf("%8s",amp;ptr->nom);
printf("Saisir prenom de Patient: ");
scanf("%8s",amp;ptr->prenom);
ptr->suivant = tete;
tete=ptr;
printf("nVoulez vous Saisir un autre Patient ?: (O,N): n");
scanf(" %c",amp;rep);
}
}
void echangedeChaine(char x[8] , char y[8]){
char temp[8];
strcpy(temp,y);
strcpy(y,x);
strcpy(x,temp);
}
void printtList(){
struct patient *temp = tete;
while(temp!=NULL){
printf("Cin: %d | Nom:%s | Prenom: %sn", temp->cin, temp->nom, temp->prenom);
temp=temp->suivant;
}
}
void trier(){
struct patient *ptr = tete;
struct patient*prec;
int echange=0;
do{
while(ptr!=NULL){
prec=ptr;
ptr=ptr->suivant;
if(strcmp(prec->nom,ptr->nom)<0){
echangedeChaine(prec->nom,ptr->nom);
echange=1;
}
}
}while(echange==1);
}
int main()
{
creationdePatient();
printtList();
trier();
printtList();
}
Кажется, это не работает после того, как я попытался его выполнить.
Комментарии:
1. Что именно вы видите?
2. У вас ужасное вопиющее повторение в
creationdePatient()
; вы должны установитьchar rep = 'O';
и иметь только код цикла, а не код перед ним. Избегать подобных повторений — всегда хорошее упражнение.3. хорошо, приятель, спасибо
4. echangedeChaine должен быть закодирован путем замены двух строковых указателей, а не содержимого! намного эффективнее… но это также означает использование указателей в структуре и их правильную инициализацию
5. вы имеете в виду замену указателя, а не содержимого?
Ответ №1:
В вашем коде есть несколько проблем, в том числе (но не обязательно ограничиваясь):
-
Ваш код в
trier()
будет разыменовывать нулевой указатель на последний элемент — поскольку егоsuivant
значение равно NULL, и вы делаете:ptr = ptr->suivant; if(strcmp(prec->nom,ptr->nom) < 0) { ... }
-
Я думаю, вы пытаетесь выполнить сортировку в неправильном порядке: когда
strcmp(prec->nom,ptr->nom)
значение отрицательное, это означает, что имя первого пациента лексикографически предшествует имени следующего пациента — в этом случае их не следует заменять.
PS — для тех, кто не владеет французским, вот небольшой глоссарий для программы OP…
tete = head
suivant = next
nom = фамилия / семейное имя
prenom = имя по имени
echange = изменить (или заменить)
chaine = список (или cain)
Комментарии:
1. можете ли вы порекомендовать, как я могу это исправить?
2. Да, измените условие цикла на
ptr != NULL amp;amp; ptr->suivant != NULL
.3. это работало хорошо, пока я не попытался поменять местами другие поля записи
4. Другой код — другой вопрос. Но, пожалуйста, задайте его с образцами ввода и вывода, чтобы люди могли воспроизвести.