大家之前都对数组进行过冒泡排序,排序的方式很简单,通过两个for循环来解决问题,也很好理解,第一次循环的时候是将整个数组中最大的数字或者说最小的数字放到数组中的最后一个,之后是将数组中第二大或者第二小的放到数组中倒数第二个,所以直接将这个思想放到链表中就可以了。
每次循环都是从头结点开始,但是第一次结尾是最后一个元素,第二次结尾是倒数第二个元素,这里是一样的,但是链表你是不确定他到底有多少个元素的,所以不能用for循环来实现,只能通过while循环来实现。同样也是两个while循环来实现,这里最不同的区别就是将for循环变成了while循环。While循环和for循环最大的不同也就是while需要每次不断的更改他的结束条件。
void SListBubbleSort(SListNode* list)
{
assert(list);
SListNode *cur;
SListNode *end;
DataType temp = 0;
cur = list;
end = NULL;
while (cur != end)
{
while (cur->_next!= end)
{
if ((cur->_data )>( cur->_next->_data))
{
temp = cur->_data;
cur->_data = cur->_next->_data;
cur->_next->_data = temp;
}
cur = cur->_next;
}
end = cur;
cur = list;
}
return;
}
assert(list);
SListNode *cur;
SListNode *end;
DataType temp = 0;
首先上来需要对传入的指针进行判断如果是空的话就不再往下进行,然后创建变量,一个是用来保存每次起点的cur另一个是每次保存终点的end,temp是链表数据类型两个数据交换的一个中间变量。
cur = list;
end = NULL;
Cur的指向的是当前链表的头结点,end指向空,也就是最后一个元素的next
while (cur != end)
{
while (cur->_next!= end)
{
if ((cur->_data )>( cur->_next->_data))
{
temp = cur->_data;
cur->_data = cur->_next->_data;
cur->_next->_data = temp;
}
cur = cur->_next;
}
end = cur;
cur = list;
}
第一次循环是从头指针开始知道最后一个元素结束,如果遇到前边的数据比后边的大就进行交换。
实现第一次遍历并且交换的是第二个while循环,一直走到最后。
while (cur->_next!= end)
{
if ((cur->_data )>( cur->_next->_data))
{
temp = cur->_data;
cur->_data = cur->_next->_data;
cur->_next->_data = temp;
}
cur = cur->_next;
}
完成一遍这个的时候链表中最大的一个元素已经跑到最后了。
然后将尾指针也就是下次要结束的位置end变成当前的cur,因为第一次while循环结束的时候cur->_next= end 也就是当前cur指向了倒数第一个元素。下次第二个while循环的条件就是cur->_next!= end 这里的end已经是倒数第一个元素了,第二次while循环结束之后cur将需要指向倒数第二个元素。
cur = list 循环一次之后cur已经不在第一个元素了,但是还是需要从头指针开始往后循环进行比大小交换,所以每次第二层while循环结束之后需要将cur重新赋值为头结点。
这样循环下来因为每次第二层的while循环结束之后都会重新给cur和end赋值,虽然cur每次都是头结点,但是end的值是变化的,从空到倒数第一个元素,到倒数第二个,依次下去,当end等于cur的时候,也就是所有循环结束了,这时候第一层while循环也就可以退出了,整个链表就排序完成了。
这时候链表的冒泡排序就完成了。