- Ways to exchange node data
- Ways to exchange node pointers
# include <iostream>
using namespace std;
typedef int ElemType;
typedef struct LinkList {
ElemType data;
struct LinkList *next;
}LinkList, *Node;
// 创建无头链表
Node createList(ElemType num) {
Node head = new LinkList;
head->next = NULL;
head->data = num;
return head;
}
// 添加节点, 头插法, 需要换头
void insertList(Node &head, ElemType num) {
Node t = head;
Node newNode = new LinkList;
newNode->next = head;
newNode->data = num;
// 头插法换头
head = newNode;
}
// 链表冒泡排序 交换数据
void bubbleSort1(Node &head) {
// 只有一个节点的情况
if (head->next == NULL) {
return;
}
// 每次循环到每次最后交换位置
Node flag = NULL, j = NULL, t = NULL;
do {
j = head;
t = flag;
flag = NULL;
while (j->next != t) {
if (j->data > j->next->data) {
//交换数据域
ElemType tData = j->data;
j->data = j->next->data;
j->next->data = tData;
flag = j->next;
}
j = j->next;
}
} while (flag != NULL);
}
// 链表排序 交换指针
/**
因为要考虑到是无头链表,
可以先用冒泡排序使得除头节点之外有序,
然后再更换头节点, 并把原来头节点插入到合适的位置(一次插排)
*/
void bubbleSort2(Node &head) {
// 只有一个节点的情况
if (head->next == NULL) {
return;
}
// 每次循环到每次最后交换位置, 对除头节点外的节点进行排序
Node flag = NULL, j = NULL, t = NULL;
do {
j = head;
t = flag;
flag = NULL;
while (j->next->next != t) {
//交换指针
if (j->next->data > j->next->next->data) {
Node p1 = j->next;
Node p2 = j->next->next;
p1->next = p2->next;
j->next = p2;
p2->next = p1;
flag = j->next->next;
}
j = j->next;
}
} while (flag != NULL);
// 更换头节点, 并且将头节点插入到合适的位置(一次插排)
Node q = head, h = head;
head = head->next;
//Node q = head->next;
while (q->next != NULL) {
if (q->next->data > h->data) {
h->next = q->next;
q->next = h;
break;
}
q = q->next;
}
}
// 打印链表
void printList (Node &head) {
Node t = head;
while (t != NULL) {
cout << t->data << " ";
t = t->next;
}
cout << endl;
}
// 销毁链表
void destoryList(Node &head) {
Node t = head;
while (t != NULL) {
Node p = t->next;
delete t;
t = p;
}
}
int main() {
Node head = createList(5);
insertList(head, 7);
insertList(head, 9);
insertList(head, 3);
insertList(head, 6);
insertList(head, 2);
insertList(head, 15);
insertList(head, 100);
insertList(head, 52);
insertList(head, 4);
printList(head);
bubbleSort2(head);
printList(head);
destoryList(head);
return 0;
}
The output is as follows: