0. 链表实现冒泡排序 —— C++详解
1. 代码实现(优化后)
#include<iostream>
using namespace std;
typedef struct LNode {
int data;
struct LNode *next;
}LNode, *LinkList;
void InsertSort(LinkList &L){
// 创建并初始化一个新的带头结点的链表
LinkList SortedL = new LNode;
SortedL->next = NULL;
// 将链表L中的结点依次插入有序链表SortedL
while (L->next) {
LNode *q = SortedL;
while (true) {
// 当前位置可以插入 或者 指针在链表末尾
// 注意 注意 注意
if ((q->next == NULL) || (q->next->data >= L->next->data)) {
LNode *temp = L->next;
L->next = temp->next;
temp->next = q->next;
q->next = temp;
break;
} else { // 当前位置不可以插入 继续寻找可以插入的位置
q = q->next;
}
}
}
L = SortedL;
}
void PrintList(LinkList &L) {
LNode *p = L->next;
while (p) {
cout << p->data << " ";
p = p->next;
}
}
int main() {
return 0;
}
2. 优化代码中出现的问题
if ((q->next->data >= L->next->data) || (q->next == NULL))
上面的代码如果指针q
指向为空,则q->next->data
会导致程序崩溃,所以应改为如下代码:
if ((q->next == NULL) || (q->next->data >= L->next->data))
3. 代码实现(优化前)
#include<iostream>
using namespace std;
typedef struct LNode {
int data;
struct LNode *next;
}LNode, *LinkList;
void InsertSort(LinkList &L){
// 创建并初始化一个新的带头结点的链表
LinkList SortedL = new LNode;
SortedL->next = NULL;
// 将链表L中的结点依次插入有序链表SortedL
while (L->next) {
LNode *q = SortedL;
// 标记是否在有序链表SortedL中找到结点可以插入的位置
// 找到则插入
// 未找到则插入到有序链表SortedL的末尾
bool flag = false;
while (q->next != NULL) {
if (q->next->data >= L->next->data) { // 当前位置可以插入
LNode *temp = L->next;
L->next = temp->next;
temp->next = q->next;
q->next = temp;
// 成功插入
// 开始将链表L中的下一结点插入有序链表SortedL
flag = true;
break;
} else { // 当前位置不可以插入 继续寻找可以插入的位置
q = q->next;
}
}
// 将结点插入到有序链表SortedL的末尾
if (flag == false) {
LNode *temp = L->next;
L->next = temp->next;
temp->next = q->next;
q->next = temp;
}
}
L = SortedL;
}
void PrintList(LinkList &L) {
LNode *p = L->next;
while (p) {
cout << p->data << " ";
p = p->next;
}
}
void InitList(LinkList &L) {
L = new LNode;
LNode *node1 = new LNode;
LNode *node2 = new LNode;
LNode *node3 = new LNode;
LNode *node4 = new LNode;
LNode *node5 = new LNode;
LNode *node6 = new LNode;
LNode *node7 = new LNode;
LNode *node8 = new LNode;
node1->data = 3;
node2->data = 5;
node3->data = 1;
node4->data = 7;
node5->data = 4;
node6->data = 4;
node7->data = 13;
node8->data = 8;
L->next = node1;
node1->next = node2;
node2->next = node3;
node3->next = node4;
node4->next = node5;
node5->next = node6;
node6->next = node7;
node7->next = node8;
node8->next = NULL;
}
int main() {
LinkList L;
InitList(L);
PrintList(L);
InsertSort(L);
cout << endl;
PrintList(L);
return 0;
}