0引言:
对于数组来说,冒泡排序查找已经再熟悉不过了,最近在用链表完成部分作业。需要对链表存储结构进行排序,值得注意的是,我在学C的时候(数据结构没开,自己也没学,后悔....)觉得链表是针对结构体的。学C++接触了OPP编程,想到了一坨坨的对象它们也是能构成链表的,链表原来是数据的存储结构!!!吐血,我得好好学学数据结构(无奈)。
1. BB两句
敲黑板!!! 重点注释1 :循环结束条件
由于是循环链表,结束条件 就写成了 Head的上一个,就是Head->_pro,也就是最后一个元素
问题1:如果不是循环链表的话,结束条件改成:p != NULL 即可
敲黑板!! 重点注释2 :排序比较内容,这个很简单了
我的代码是对字母的ASCII进行大小比较,按照字母从小到大排序。看你比较内容了
注意!!!:
在链表中,我采用的方法是交换值!交换值!交换值!
千万不要搞错了,这不是操作节点的。
因为我的节点中数据少,暂时没有直接去交换节点。
日后在数据多的时候直接操作节点来排序!!!
好了,看代码:
2. 链表的冒泡排序代码:
// 排序
void Sort_People(TeleNumber* List)
{
// TeleNumber: 链表存储结构,(单项,双向)单链表/循环链表都可以的呢!无所谓的
// 本段代码中 我的链表是:双向循环链表,按照字母顺序排列
TeleNumber* p = new TeleNumber(),*q =new TeleNumber();
for ( p = List; p != List->_pro ; p = p->_next)
{ // 敲黑板!! 重点注释1 :
// List 是头节点 ,由于是循环链表,结束条件 就写成了 Head的上一个,也就是最后一个元素
// ?????如果不是循环链表的话,结束条件改成:p != NULL 即可
for ( q = List; q != List->_pro ; q = q->_next)
{
// 敲黑板!! 重点注释2 :
// NameFirstChar:返回值就是一个字母而已,进行大小比较,按照字母从小到大排序
if ( q->NameFirstChar() > q->_next->NameFirstChar())
{
// 以下是交换内容,看你的啦!
//1. 交换两个节点的 用户名字
string str = q->GetName();
q->ModifyName( q->_next->GetName() );
q->_next->ModifyName(str);
//2. 交换两个节点的 用户电话号
str = q->GetNumber();
q->ModifyNumber(q->_next->GetNumber());
q->_next->ModifyNumber(str);
//3. 交换两个节点的 用户邮箱号
str = q->Getemail();
q->ModifyEmail(q->_next->Getemail());
q->_next->ModifyEmail(str);
}
}
}
cout << "Sort over\n";
}
结语: 下次直接操作节点来排序!!!