typedef struct node {//双向链表
union {
int len;
int data;
};
struct node *next;
struct node *prior;
} doubleLink, *doubleLinkPtr;
doubleLinkPtr Create() {//创建链表
doubleLinkPtr H = (doubleLinkPtr)malloc(sizeof(doubleLink));
if (NULL == H) {
perror("链表创建失败!");
exit(0);
}
H->len = 0;
H->next = NULL;
H->prior = NULL;
printf("双向链表创建成功!\n");
return H;
}
void insert(doubleLinkPtr H, int data) {//封装数据并插入
if (NULL == H) {
perror("插入失败!\n");
exit(0);
}
doubleLinkPtr P = (doubleLinkPtr)malloc(sizeof(doubleLink));
P->data = data;
P->next = NULL;
P->prior = NULL;
if (H->next != NULL) {
P->next = H->next;
P->prior = H;
H->next->prior = P;
H->next = P;
} else {
H->next = P;
P->prior = H;
}
H->len++;
return;
}
void Show(doubleLinkPtr H) {//输出
if (NULL == H) {
perror("显示失败!\n");
exit(0);
}
doubleLinkPtr P = H;
for (int i = 0; i < H->len; i++) {
P = P->next;
printf("%d ", P->data);
}
printf("\n");
}
void Swap(int *a, int *b) {//交换两个节点的数据
int temp = *a;
*a = *b;
*b = temp;
}
void Fast(doubleLinkPtr Head, doubleLinkPtr Tail) {//快速排序
if (Head == NULL || Tail == NULL || Head == Tail || Head->prior == Tail) {
return;
}
doubleLinkPtr Pivot = Head;
doubleLinkPtr Left = Head;
doubleLinkPtr Right = Tail;
while (Left != Right && Left->prior != Right) {
while (Right->data >= Pivot->data && Left != Right) {
Right = Right->prior;
}
if (Left == Right) break;
Swap(&Left->data, &Right->data);
Left = Left->next;
while (Left->data <= Pivot->data && Left != Right) {
Left = Left->next;
}
if (Left == Right) break;
Swap(&Left->data, &Right->data);
Right = Right->prior;
}
Fast(Head, Right->prior);
Fast(Right->next, Tail);
}
int main(int argc, const char *argv[]) {
doubleLinkPtr H = Create();
insert(H, 9);
insert(H, 2);
insert(H, 4);
insert(H, 3);
insert(H, 1);
Show(H);
doubleLinkPtr P = H;
for (int i = 0; i < H->len; i++) {
P = P->next;
}
doubleLinkPtr T = P;
Fast(H->next, T);
Show(H);
return 0;
}