单链表实现冒泡排序

来源:互联网 发布:笔记本无线找不到网络 编辑:程序博客网 时间:2024/06/05 00:59

思路:利用三个指针,一个指向尾结点(排序终止条件)的tail结点,一个prev指针,一个cur指针,进行比较,每次排完一遍后,将tail指针向前挪动一个单位,因为最大(或最小)的结点已经到最后了,已经不需要再进行排序了

当然也可以进行优化,加一个标志位...



#define _CRT_SECURE_NO_WARNINGS 1//单链表冒泡排序#include<iostream>using namespace std;typedef int DataType;typedef struct SListNode{DataType data;            //数据struct SListNode * next;   //指向下一个结点的指针}SListNode;SListNode* CreateNode(DataType x)  //创造结点{//1.先开辟空间 2.数据赋给data 3.指针置空SListNode* NewNode = (SListNode *)malloc(sizeof (SListNode));NewNode->data = x;NewNode->next = NULL;return NewNode;}void PushBack(SListNode * &ppHead, DataType Data){//1.none 2.one and moreif (ppHead == NULL){ppHead = CreateNode(Data);}else{//1.先找到尾结点 2.把新节点链起来SListNode* cur = ppHead;while (cur->next){cur = cur->next;}cur->next = CreateNode(Data);}}//打印void PrintSNodeList(SListNode *&ppHead){while (ppHead){printf("%d->", ppHead->data);ppHead = ppHead->next;}cout << "NULL" << endl;}//冒泡排序void BubbleSortSlist(SListNode* pHead){if (pHead == NULL || pHead->next == NULL)  //边界条件{return;}SListNode* prev = pHead;          SListNode* cur = pHead->next;SListNode* Tail = NULL;while (Tail != pHead)   //tail=prev 每次调整完一次后都将tail向前挪动一次{cur = pHead->next;   //每次跳整完一次后,cur再次指向头结点的下一个结点prev = pHead;        //prev指向pheadwhile (cur != Tail){if (prev->data >cur->data)//比较节点信息,如果满足条件就交换它{DataType x;x = cur->data;cur->data = prev->data;prev->data = x;}prev = prev->next;cur = cur->next;//指向下一个节点,实现迭代}Tail = prev;//循环结束后prev指向尾节点,赋值给Tail}}void Test(){SListNode* pHead = NULL;PushBack(pHead, 8);PushBack(pHead, 7);PushBack(pHead, 6);PushBack(pHead, 5);PushBack(pHead, 4);PushBack(pHead, 3);PushBack(pHead, 2);PushBack(pHead, 1);BubbleSortSlist(pHead);PrintSNodeList(pHead);}int main(){Test();system("pause");return 0;}


若有不正确的地方希望能够指出,大家一起学习进步,谢谢了

1 0
原创粉丝点击