c语言链表排序 从 if(head == NULL||head->zf<s->zf)开始 有点看不懂 求注释(每一句)

2025-06-22 11:00:31
推荐回答(3个)
回答1:

//首先说这是一个从大到小的排序
if(head == NULL||head->zfzf)//如果是第一次输入,或者输入的总分比头还大
{
s->next=head;//就将s放在头的前面,最为做大
head=s;//然后让head指针重新指向头部最大

}
else
{
p=head;//如果不是比头大,将p指向头指针,方便指针移动比较后,能够利用p插入。
q=p->next;//而q是p的下一个,利用q做比较,p和q是一对基友。
while(q!=NULL&&s->zf <= q->zf)//如果没有到链表尾,或者输入的s比q还小,
{
p=q;
q=q->next;//p和q继续后移动。
}//while循环完毕了,就是说明到了链表结尾,或者找到了s比q要大,但是比p要小,因为p的上一个循环就是q嘛,上个循环比较过的
s->next=q;//既然比q大,但是比p小,肯定放在p的后面,先前是....p->q->...,现在要改成..p->s->q//就将s->q,然后p->s,就链接起来了。

p->next=s;
}

回答2:

if(head == NULL||head->zfzf) //判断head是否为空 或者 head->zf是否小于s->zf
{
s->next=head; .//使s->next指向head的地址
head=s; //将s中的内容赋值给head

}
else
{
p=head; //使p指向head的地址
q=p->next; //q指向p的下一个指针(地址)
while(q!=NULL&&s->zf <= q->zf) //当q指针不为空 而且 s->zf 小于等于q->zf时执行循环
{
p=q; //p指向q所指的
q=q->next; //q指向下一个指针(地址)
}
s->next=q; //s的下一个指针是指向q的
p->next=s; //p的下一个指针是指向s的
}

getchar();//修改
printf(" 继续输入按y\n");//修改
scanf("%c",&ch);
}
//输出链表 这里我懂
g=head;

while(g!=NULL)
{

printf("%4d",g->xh);
printf("%4s",g->sname);
printf("%4d",g->sx);
printf("%4d",g->yw);
printf("%4d",g->zf);
printf("\n ");
g=g->next; }

}

回答3:

if else语句就是来判断head如果为空或者head->zf小于s->zf时就确定head的值为s,如果条件不成立的话就把head赋值给p,然后再用while来判断p的条件,然后进行相应的动作