c语言链表排序问题,程序如下。t->next = p->next;p->next = q->next; q->next = t->next;是什么意思?

void Sort(mes* head)
{
mes* p = head;
mes* q = head;
mes* t = NULL;
t = (mes*)malloc(sizeof(mes));
if (t == NULL)
{
printf("system error!");
exit(-1);
}
for (p=head->next; p->next!=NULL;p=p->next)
{
for (q=p->next;q!=NULL ;q=q->next)
{
if (p->StudentID > q->StudentID)
{
*t = *p;
*p = *q;
*q = *t;
t->next = p->next;
p->next = q->next;
q->next = t->next;
}
}
}
free(t);
}
void Fre(mes* head)
{
mes*p;
for (; head != NULL;)
{
p = head;
head = head->next;
free(p);
printf("success");
}
}

 *t = *p;  //讲p赋给t
 *p = *q;  //讲q赋给p
 *q = *t;  //讲t赋给q
//上面三行就是交换p和q的,按你程序的意思,StudentID更小的在前面,大的往后放。
//其实这个循环就是经典的冒泡排序原理。 
 t->next = p->next;  //将p的下一个节点交给t的下一个节点。
 p->next = q->next;  //将q的下一个节点交给p的下一个节点。
 q->next = t->next;  //将t的下一个节点交给q的下一个节点。
//这是交换p和q的下一个节点,修改next值。

//结构体可以直接赋值的,也就是第一个三行交换,不仅交换了数值StudentID,应该也同时交换了next指针,所以后面三行其实是还原next指针的,否则上面的for循环,就换乱了。简单的做法,应该可以直接交换StudentID。就不需要考虑指针链接的顺序了。
 t->StudentID = p->StudentID;  

 p->StudentID = q->StudentID;  

 q->StudentID = t->StudentID;
 //直接交换值StudentID

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-12-28
if (p->StudentID > q->StudentID) //当前p的id大于q的id,则交换两个结点数据
{
*t = *p;
*p = *q;
*q = *t;
//以上完成两结点数据的交换,但链表就乱了,以下,完成链表的整理
//t保存的是原来的p, p中是原来的q q中是原来的p(与t相同) 你画个图就理解了
t->next = p->next; //记录原q的后继
p->next = q->next; //修改当前的p(原q)后继,变成原p的后继
q->next = t->next; //修改当前的q(原p)后继,变为原q的后继
}
第2个回答  2014-12-28
对 - >下一个地址,点击看详细对 - 下一个节点>地址下一= QP = q为下一个节点p为q,则P = Q,等于移动到下一个节点在

中国,我不知道该怎么形容,我希望你能理解
相似回答