C 尝试交换节点数据

C 尝试交换节点数据,c,C,我试图按名称排列链表数据,以便将每个节点名称与下一个节点名称进行比较。是的,我想交换节点数据,按名称排列链表 我尝试将节点的每个数据与另一个数据交换,以防函数“trier”中的测试为真,测试为(strcmp(prec,ptr)cin); printf(“患者姓名”); scanf(“%8s”,&tete->nom); printf(“患者的Saisir prenom de Patient:”); scanf(“%8s”,&tete->prenom); printf(“患者的诞生:”); scan

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

我尝试将节点的每个数据与另一个数据交换,以防函数“trier”中的测试为真,测试为
(strcmp(prec,ptr)<0)
。直到最后一次,它似乎工作得很好。

#包括
#包括
#包括
#包括
结构病人{
int-cin;
字符名称[8];
char-prenom[8];
内坦尼;
结构病人*suivant;
};
struct patient*tete=NULL;
无效患者(){
结构病人*ptr;
字符代表;
ptr=malloc(sizeof(struct-patient));
tete=ptr;
printf(“新患者编号:”);
scanf(“%d”和&tete->cin);
printf(“患者姓名”);
scanf(“%8s”,&tete->nom);
printf(“患者的Saisir prenom de Patient:”);
scanf(“%8s”,&tete->prenom);
printf(“患者的诞生:”);
scanf(“%d”,&tete->annee);
tete->suivant=NULL;
printf(“\N您是否同意患者?:(O,N):\N”);
scanf(“%c”、&rep);
while(toupper(rep)='O'){
ptr=malloc(sizeof(struct-patient));
printf(“新患者编号:”);
scanf(“%d”和&ptr->cin);
printf(“患者姓名”);
scanf(“%8s”和&ptr->nom);
printf(“患者的Saisir prenom de Patient:”);
scanf(“%8s”和&ptr->prenom);
printf(“患者的诞生:”);
scanf(“%d”和&ptr->annee);
ptr->suivant=tete;
tete=ptr;
printf(“\N您是否同意患者?:(O,N):\N”);
scanf(“%c”、&rep);
}
}
void echangednom(结构患者*x,结构患者*y){
炭温[8];
strcpy(温度,y->nom);
strcpy(y->nom,x->nom);
strcpy(x->nom,temp);
}
void echangedePrenom(结构患者*x,结构患者*y){
炭温[8];
strcpy(临时,y->prenom);
strcpy(y->prenom,x->prenom);
strcpy(x->prenom,temp);
}
无效eChangedSentiers(结构患者*x,结构患者*y){
内部温度=0;
温度=y->cin;
y->cin=x->cin;
x->cin=温度;
}
无效EchangedSannes(结构患者*x,结构患者*y){
内部温度=0;
温度=y->退火;
y->ANNE=x->ANNE;
x->退火=温度;
}
void printtList(){
结构患者*温度=太特;
while(temp!=NULL){
printf(“Cin:%d | Nom:%s | Prenom:%s | Anne de naissance:%d\n”,
临时->cin,临时->名称,临时->前项,临时->退火);
温度=温度->温度;
}
}
void trier(){
结构患者*ptr=tete;
结构患者*prec=NULL;
国际变化;
做{
echange=0;
while(ptr!=NULL&&ptr->suivant!=NULL){
prec=ptr;
ptr=ptr->suivant;
如果(strcmp(prec->nom,ptr->nom)<0){
echangedeNom(prec、ptr);
echangedePrenom(prec,ptr);
echangedesentiers(prec、ptr);
埃昌德桑内斯(prec、ptr);
echange=1;
}
}
}而(echange==1);
}
int main(){
创造性的病人();
printtList();
trier();
printf(“========================================\n”);
printtList();
}

一些数据在交换时得到了错误的信息,如交换后的
cin
数字不再相同。

您在这里交换了两次整数:

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

顺便说一句,这里是学习调试代码的第一步:。

我已经编辑过了。顺便说一句,你可以检查下一期吗。@AyoubSouid,更好的方法是学习调试你正在编写的程序。另外,请查看本页有关StackOverflow的用途:关于:
scanf(“%8s”,&tete->prenom)1)字段:
prenom
只有8字节长。输入格式说明符:
%s
始终向输入追加NUL字节,因此“%8s”允许输入溢出输入缓冲区。建议
“%7s”
2)始终检查返回值(而不是参数值),以确保操作成功。注意:返回的值是成功输入转换(或EOF)次数的计数。建议:
if(scanf(“%7s”)、&tete->prenom)!=1{//handle error}
scanf()
的其他调用也存在类似的注意事项,关于:
scanf(“%8s”、&ptr->nom)
,引用数组将降级为数组第一个字节的地址
char*ptr->nom[8]
导致编译器输出::
:27:14:警告:格式“%s”要求参数类型为“char*”,但参数2的类型为“char(*)[8][-Wformat=]
建议:删除前导“&”
while(ptr!=NULL && ptr->suivant!=NULL){
    // [...]
    echangedesentiers(prec,ptr);
    echangedesentiers(prec,ptr);
    // [...]
}