双链表实现冒泡排序

方法一:

 双链表的指针较为复杂,如果数据域部分较为简单,则直接对数据域进行交换即可。
void dLinkList::nameSort()
{   if(isEmpty())
        cout<<"空链表!\n";
    else if(length()==1)
        cout<<*first;
    else
    {   Student<NodeType> *p=first,*q;
        for(p=first;p!=rear;p=p->next)
            for(q=p->next;q!=NULL;q=q->next)  
            {   if(strcmp(p->name,q->name)>0)
                    swap(p,q); 
            }
    }
}

方法二

void StuLinkList::Student_Name_Sort()
{

    if (IsEmpty())
    {
        cout << "\n链表是空的\n";
        return;
    }
    string MaxNumber = "0", Temp = "0";
    Stu *CurrentNode, *NewFirstNode = NULL, *PreNode = NULL, *NewRearNode = NULL;
    do
    {
        CurrentNode = Firstnode;
        while (CurrentNode)
        {
            Temp = CurrentNode->name;
            if (Temp > MaxNumber)
            {
                MaxNumber = Temp;
                NewFirstNode = CurrentNode;
            }
            Temp="0";
            CurrentNode = CurrentNode->Nextnode;
        }
        MaxNumber ="0";

        if ((NewFirstNode->Prenode) && (NewFirstNode->Nextnode))
        {
            NewFirstNode->Prenode->Nextnode = NewFirstNode->Nextnode;
            NewFirstNode->Nextnode->Prenode = NewFirstNode->Prenode;
            NewFirstNode->Prenode = NULL;
            NewFirstNode->Nextnode = NULL;
        }
        else if (NewFirstNode->Prenode)
        {
            Rearnode = Rearnode->Prenode;
            NewFirstNode->Prenode->Nextnode = NULL;
            NewFirstNode->Prenode = NULL;
        }
        else if (NewFirstNode->Nextnode)
        {
            Firstnode = Firstnode->Nextnode;
            NewFirstNode->Nextnode->Prenode = NULL;
            NewFirstNode->Nextnode = NULL;
        }
        else
        {
            Firstnode = NULL;
            Rearnode = NULL;
        }
        if (!PreNode)
        {
            PreNode = NewFirstNode;
            NewRearNode = PreNode;
            continue;
        }
        NewFirstNode->Nextnode = PreNode;
        PreNode->Prenode = NewFirstNode;
        PreNode = NewFirstNode;
    } while (!IsEmpty());
    Firstnode = NewFirstNode;
    Rearnode = NewRearNode;
    cout << "排序完成.\n";
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值