1、链表排序之插入排序:
测试代码:
#include "date.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 定义链表结构
typedef struct Node {
int data;
struct Node *next;
} Node;
// 生成随机数
int generateRandomNumber() {
return rand() % 100; // 生成0到99之间的随机数
}
// 将随机数添加到链表中
void appendToList(Node **head, int value) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = value;
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
} else {
Node *current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
// 插入排序
void insertionSort(Node **head) {
Node *sorted = NULL;
Node *current = *head;
while (current != NULL) {
Node *next = current->next;
if (sorted == NULL || sorted->data >= current->data) {
current->next = sorted;
sorted = current;
} else {
Node *temp = sorted;
while (temp->next != NULL && temp->next->data < current->data) {
temp = temp->next;
}
current->next = temp->next;
temp->next = current;
}
current = next;
}
*head = sorted;
}
// 遍历链表并输出数据和地址
void printList(Node *head) {
Node *current = head;
while (current != NULL) {
printf("Data: %d, Address: %p\n", current->data, (void *)current);
current = current->next;
}
}
int main() {
int times = getTime();
int n;
printf("请输入要生成的随机数的个数n:");
scanf("%d", &n);
srand(time(NULL)); // 设置随机数种子
Node *head = NULL;
// 生成n个随机数并添加到链表中
for (int i = 0; i < n; i++) {
int randomNumber = generateRandomNumber();
appendToList(&head, randomNumber);
}
// 输出排序前的链表
printf("排序前的链表:\n");
printList(head);
// 对链表进行插入排序
insertionSort(&head);
// 输出排序后的链表
printf("\n排序后的链表:\n");
printList(head);
// 释放链表节点的内存
Node *current = head;
while (current != NULL) {
Node *temp = current;
current = current->next;
free(temp);
}
return 0;
}
运行结果如下:
2、链表排序之归并排序:
测试代码:
#include "date.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 定义节点的结构体
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建新的节点,并将数据赋值给这个节点,然后返回创建的节点。
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 将这个节点的指针指向链表头部指针指向的节点,
// 将链表头部指针指向新创建的节点,新节点便插入到链表的头部。
void addToLinkedList(Node** head, int data) {
Node* newNode = createNode(data);
newNode->next = *head;
*head = newNode;
}
// merge 函数归并排序,用于合并两个已排序的链表。
// 接收两个链表头指针 left 和 right,并返回合并后链表的头指针。
Node* merge(Node* left, Node* right) {
Node* result = NULL;
if (left == NULL)
return right;
else if (right == NULL)
return left;
if (left->data <= right->data) {
result = left;
result->next = merge(left->next, right);
} else {
result = right;
result->next = merge(left, right->next);
}
return result;
}
// split 函数用于将链表 source 分割成两个链表,front 指向前半部分,back 指向后半部分。
// “前半部分”和“后半部分”基于链表长度的中点划分。
void split(Node* source, Node** front, Node** back) {
if (source == NULL || source->next == NULL) {
*front = source;
*back = NULL;
} else {
Node* slow = source;
Node* fast = source->next;
while (fast != NULL) {
fast = fast->next;
if (fast != NULL) {
slow = slow->next;
fast = fast->next;
}
}
*front = source;
*back = slow->next;
slow->next = NULL;
}
}
// mergeSort 函数接收一个指向链表头指针的指针(Node** head)。
// 在函数内部修改链表头指针,并将这些修改反映到函数外部。
void mergeSort(Node** head) {
Node* current = *head;
Node* left;
Node* right;
if (current == NULL || current->next == NULL) {
return;
}
split(current, &left, &right);
mergeSort(&left);
mergeSort(&right);
*head = merge(left, right);
}
// 打印链表中的数据和地址。
void printLinkedList(Node* head) {
Node* current = head;
while (current != NULL) {
printf("Data: %d, Address: %p\n", current->data, (void*)current);
current = current->next;
}
}
int main() {
int times = getTime();
int n;
printf("Enter the number of random numbers: ");
scanf("%d", &n);
Node* head = NULL;
//将随机数添加到链表中。
for (int i = 0; i < n; i++) {
int randNum = rand()%100;
addToLinkedList(&head, randNum);
}
// 打印排序前的链表
printf("Unsorted linked list:\n");
printLinkedList(head);
// 归并排序
mergeSort(&head);
// 打印排序后的链表。
printf("\nSorted linked list:\n");
printLinkedList(head);
return 0;
}
运行结果如下: