大家好,今天继续模板实战编程,我们今天的目标是用模板写一个针对链表的冒泡排序算法,具体如例1所示。
例1 冒泡排序-链表
ListBubbleSort.hpp的内容:
#ifndef _LIST_BUBBLE_SORT_H_ #define _LIST_BUBBLE_SORT_H_ #include <iostream> using namespace std; template<typename T> struct Node { T m_Data; Node * m_pNext; }; template<typename T> bool BubbleSort(Node<T> * & pHead) { Node<T> * pCurNode = NULL; Node<T> * pTemp = NULL; Node<T> * pNext = NULL; T tTemp; bool bChange = false; if (!pHead) return false; pCurNode = pHead; while (pCurNode) { pTemp = pHead; pNext = pTemp->m_pNext; bChange = false; while (pTemp && pNext) { if (pTemp->m_Data > pNext->m_Data) { tTemp = pTemp->m_Data; pTemp->m_Data = pNext->m_Data; pNext->m_Data = tTemp; bChange = true; } pTemp = pTemp->m_pNext; pNext = pTemp->m_pNext; } if (!bChange) break; pCurNode = pCurNode->m_pNext; } return true; } #endifmain.cpp的内容:
#include "ListBubbleSort.hpp" #include <time.h> void main() { int i = 0; Node<int> * pInt = NULL; Node<int> * pNewNode = NULL; Node<int> * pCurNode = NULL; srand(time(NULL)); for (i = 0; i < 10; i++) { pNewNode = new Node<int>; if (pNewNode == NULL) { while (pInt) { pCurNode = pInt; pInt = pInt->m_pNext; delete pCurNode; } pInt = NULL; return; } pNewNode->m_Data = rand() % 100; pNewNode->m_pNext = pInt; pInt = pNewNode; } cout << "排序前:" << endl; pCurNode = pInt; while (pCurNode) { cout << pCurNode->m_Data << ' '; pCurNode = pCurNode->m_pNext; } cout << endl; if (BubbleSort<int>(pInt) == false) { cout << "排序失败." << endl; } else { cout << "排序成功." << endl; } cout << "排序后:" << endl; pCurNode = pInt; while (pCurNode) { cout << pCurNode->m_Data << ' '; pCurNode = pCurNode->m_pNext; } cout << endl; while (pInt) { pCurNode = pInt; pInt = pInt->m_pNext; delete pCurNode; } pInt = NULL; _CrtDumpMemoryLeaks(); system("pause"); return; }运行效果如图1所示:
图1 运行效果
今天,我们一起实现了链表的冒泡排序,希望大家回去再实践一下,加深体会。