实现一个双向链表的快速排序。
1>程序代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;// 定义双向链表节点结构
typedef struct Node {int data;struct Node* prev;struct Node* next;
} Node;// 创建新节点
Node* createNode(int data) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->prev = NULL;newNode->next = NULL;return newNode;
}// 在链表尾部插入节点
void insertNode(Node** head, int data) {Node* newNode = createNode(data);if (*head == NULL) {*head = newNode;return;}Node* temp = *head;while (temp->next != NULL) {temp = temp->next;}temp->next = newNode;newNode->prev = temp;
}// 交换两个节点的数据
void swap(Node* a, Node* b) {int temp = a->data;a->data = b->data;b->data = temp;
}// 分区函数
Node* partition(Node* low, Node* high) {int pivot = high->data;Node* i = low->prev;for (Node* j = low; j != high; j = j->next) {if (j->data <= pivot) {i = (i == NULL) ? low : i->next;swap(i, j);}}i = (i == NULL) ? low : i->next;swap(i, high);return i;
}// 双向链表快速排序函数
void quickSort(Node* low, Node* high) {if (high != NULL && low != high && low != high->next) {Node* pi = partition(low, high);quickSort(low, pi->prev);quickSort(pi->next, high);}
}// 打印双向链表
void printList(Node* head) {Node* temp = head;while (temp != NULL) {printf("%d ", temp->data);temp = temp->next;}printf("\n");
}int main(int argc, const char *argv[])
{Node* head = NULL;// 插入一些测试数据insertNode(&head, 3);insertNode(&head, 1);insertNode(&head, 4);insertNode(&head, 1);insertNode(&head, 5);insertNode(&head, 9);insertNode(&head, 2);insertNode(&head, 6);insertNode(&head, 5);insertNode(&head, 3);insertNode(&head, 8);printf("排序前: ");printList(head);// 找到链表的最后一个节点Node* last = head;while (last->next != NULL) {last = last->next;}// 调用快速排序函数quickSort(head, last);printf("排序后: ");printList(head);return 0;
}
2>运行效果