C++单链表实现冒泡排序
2015-11-10 18:21
477 查看
好学的丽华学妹问了我一个冒泡排序的问题,由于没有用数组,她瞬间就不会写了。好吧,其实之前本人也没有写过,但是对于冒泡排序还是比较熟悉的,就试着用其中的思想对照着写了一个小demo,当然,写得匆忙,很不规范滴就用了一个文件就暴力滴搞定了。如果有错误,希望您批评指正呀。全部代码如下:
其实,如果是要实现排序,用指针实现快排可能是个不错的选择,当然本人还不能顺利写出来……其实运用插入排序解决是不是会简单一些
干掉一个节点,记录这个节点的信息
创建一个新的节点,赋值为刚刚被干掉的节点的信息
插入有序的链表中
没实现这种思路,有兴趣的小盆友可以试一试。另外,欢迎拍砖!
#include <iostream> using namespace std; struct node { int index; node* next; }; class MyList { private: node* head; int length; public: MyList() { head = NULL;//头指针为空 length = 0;//长度为0 } ~MyList() { node* left = head; node* right = NULL; while (left != NULL) { right = left; left = left->next; delete right; } } void addNode(int user_index) { if (isEmpty()) { head = new node(); head->next = NULL; head->index = user_index; } else { //创建一个新的节点 node* newnode = new node(); newnode->index = user_index; newnode->next = NULL; //将节点添加到链表的最末端 node* t = head; while (t->next!=NULL) { t = t->next; } t->next = newnode; length++; } } int getLength() { return length; } void display() { if (isEmpty()) { cout << "The list is empty!"; return; } node* temp = head; while (temp) { cout << temp->index; if (!temp->next)//已至链表尾,可以结束输出了。 { break; } cout << "->"; temp = temp->next; } cout << endl; } void lhInput() { for (int i = 12; i>0; i--) { addNode(i); } } bool isEmpty() { if (head==NULL) { return true; } else { return false; } } void bubbleSort() { if (isEmpty()) { return; } //temp指针用来进行指向要交换的两个节点的左边一个 node* temp = head; while (temp && temp->next) { if (temp->index > temp->next->index) { exchangeNode(temp, temp->next); } } //尾指针总是指向已经排好的元素的首地址,这里我们先移到链表尾部等待 node* tail = head; while (tail->next) { tail = tail->next; } //外层还是数组的思想,内层就是链表的思想了,为什么外层要用数组的思想呢?因为这样比较简洁,不易搞错 for (int i = 0; i < length; i++) { temp = head; while (temp->next != tail) { if (temp->index > temp->next->index) { exchangeNode(temp, temp->next); } } tail = temp; } } //交换相邻两个节点 void exchangeNode(node* left, node* right) { //如果left是头结点 if (left==head) { left->next = right->next; right->next = left; head = right; return; } //找到左节点的前一个节点 node* before_left = head; while (before_left->next!=left) { before_left = before_left->next; } before_left->next = right; left->next = right->next; right->next = left; } }; int main() { MyList hengbao; hengbao.lhInput(); hengbao.display(); hengbao.bubbleSort(); hengbao.display(); system("pause"); return 0; }
其实,如果是要实现排序,用指针实现快排可能是个不错的选择,当然本人还不能顺利写出来……其实运用插入排序解决是不是会简单一些
干掉一个节点,记录这个节点的信息
创建一个新的节点,赋值为刚刚被干掉的节点的信息
插入有序的链表中
没实现这种思路,有兴趣的小盆友可以试一试。另外,欢迎拍砖!
相关文章推荐
- [C/C++]反转链表
- 冒泡排序
- C#实现基于链表的内存记事本实例
- C#冒泡法排序算法实例分析
- C++实现对输入数字组进行排序
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++实现简单的学生管理系统
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法
- C#实现的简单链表类实例
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- 找出链表倒数第n个节点元素的二个方法
- c++冒泡排序示例分享
- Java中的数组排序方式(快速排序、冒泡排序、选择排序)
- python冒泡排序算法的实现代码
- Java数据结构之简单链表的定义与实现方法示例
- C语言单循环链表的表示与实现实例详解
- c语言实现冒泡排序、希尔排序等多种算法示例
- C++实现的链表类实例