带头结点的单链表冒泡排序

来源:互联网 发布:spss软件应用 编辑:程序博客网 时间:2024/05/17 01:05

本代码描述了带头结点的单链表的冒泡排序,通过指针的移动来完成,其原理跟一维数组的冒泡排序一致,主要就是第一次排序将最大的数落到链表的最后一个,第二次将次大的数落在倒数第二个位置。复杂度O(n^2)。具体过程代码中已有解释。第一次写写博客,如有错误,望大家不吝赐教!

#include <iostream>using namespace std;//链表中结点的结构体:由value值和一个结构体指针构成struct LinkNode{    int value;    struct LinkNode *link;};//插入链表节点LinkNode * InputList(LinkNode *head){    head = new LinkNode;//本例为带头结点的链表    head->link = NULL;    int size;    cout<<"请输入链表结点个数"<<endl;    cin>>size;      cout<<"请输入各个结点的值"<<endl;    for(int i=0;i<size;i++)    {        LinkNode * NewNode = new LinkNode;        cin>>NewNode->value;        NewNode->link = head->link;        head->link = NewNode;    }    return head;}//输出链表void OutputList(LinkNode * head){    LinkNode * pass = head;    while(pass->link)    {        cout<<pass->link->value<<" ";        pass = pass->link;    }    cout<<endl;}LinkNode * ListSort(LinkNode *head){    LinkNode * p, *q, *tail, *h;    //tail指针的作用是每次冒泡排序后指向最后一个数(找出的最大值)的前一个数,效果是下一次的冒泡排序次数减少一次,提高了代码效率    tail = NULL;    h = head;    while(h->link!=tail)    {        p = head;        q = p->link;        while(q->link!=tail)        {            if(p->link->value > q->link->value)            {                p->link = q->link;                q->link = q->link->link;                p->link->link = q;                p = p->link;            }            else            {                p = p->link;                q = q->link;            }        }        tail = q;//前移一位    }    return head;}int main(){    LinkNode *head = NULL;//head指针是把各个函数链接起来的桥梁    head = InputList(head);//插入链表节点    cout<<"排序前:"<<endl;    OutputList(head);//输出排序前各节点的值    head = ListSort(head);//排序    cout<<"排序后:"<<endl;    OutputList(head);//输出排序后各节点的值    //释放内存    while(head)    {        LinkNode *del = head;        head = head->link;        delete del;    }    return 0;}


1 0
原创粉丝点击