void sort(void)
{
Node* pi = head;
while (pi != NULL)
{
int sum = 0;
for (int cnt = 0; cnt < 4; cnt++)
{
sum += pi->score[cnt];
}
pi->total = sum;
pi->average = (double)(sum) / 4;
pi = pi->next;
}
Node* headp = (Node*)malloc(sizeof(struct node));
headp->next = head;
Node* pt1 = headp;
Node* pt2;
Node* rear;
while (pt1->next->next != NULL)
{
pt2 = pt1->next->next;
while (pt2 != NULL)
{
rear = pt2->next;
if (pt1->next->average > pt2->average)
{
Node* find = headp;
while (find->next != pt2)
{
find = find->next;
}
Node* temp = pt1->next;
pt1->next = pt2;
if (pt2 == temp->next)
{
pt2->next = temp;
}
else
{
find->next = temp;
pt2->next = temp->next;
}
temp->next = rear;
}
pt2 = rear;
}
pt1 = pt1->next;
}
head = headp->next;
free(headp);
}头歌上的题目——要求交换结点时要直接交换结点的指针域而不是交换两结点的值(现在想想交换两结点的值还是更好写555)
这里有几个要点:
1.设置哑结点,同时冒泡排序的第一个游码用指针指向的next结点(为了不修改游码的值)
2.冒泡排序的第二个游码直接用结点(为了保证与第一个游码的next不冲突)
3.特殊情况的处理即两个要交换的结点相邻,则第二个游码的next应该指向第一个游码而非第一个游码的next(不然就指向了自己然后就死循环了)
4.非特殊情况还得用一个find来找到pt2的前一个结点。
5.rear指针指向pt2的next——保持不变
6.最后要注意把头节点重新定义(毕竟时全局变量),然后把哑结点释放掉
版权声明:本文为weixin_61652444原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。