算法思想:构建一个只含头节点新表,在新表中插入一个值为x的临时节点,在完成操作之后再将其删除。依次访问链表中的每一个数据节点,如果当前访问节点小于x,则将其插入链表头;如果当前节点大于x,则将其插入链表尾;如果当前节点等于x,则将其插入到临时节点之前,同时更新临时节点的前驱;重复上述步骤,直到所有数据节点停止,最后删除临时节点。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct LinkNode {
Elemtype data;
struct LinkNode* next;
}LinkNode, * LinkList;
void creatLinkList(LinkList& L) {
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
LinkNode* ptail = L;
int num;
while (scanf("%d", &num) && num < 99999) {
LinkNode* pnode = (LinkNode*)malloc(sizeof(LinkNode));
pnode->data = num;
pnode->next = ptail->next;
ptail->next = pnode;
ptail = pnode;
}
}
void printLinklist(LinkList L) {
LinkNode* pnode = L->next;
while (pnode != NULL) {
printf("%d ", pnode->data);
pnode = pnode->next;
}
printf("\n");
}
/*构建一个只含头节点新表,在新表中插入一个值为x的临时节点,在完成操作之后再将其删除。
依次访问链表中的每一个数据节点,如果当前访问节点小于x,则将其插入链表头;如果当前节点大于x,则将其插入链表尾;
如果当前节点等于x,则将其插入到临时节点之前,同时更新临时节点的前驱;重复上述步骤,直到所有数据节点停止,最后删除临时节点*/
void sortLinkList(LinkList L, Elemtype x) {
LinkNode* pmove = L->next;
L->next = NULL;
LinkNode* px = (LinkNode*)malloc(sizeof(LinkNode));
px->data = x;
px->next = L->next;
L->next = px;
LinkNode* prex = L;
LinkNode* ptail = px;
//注意下面元素插入的处理步骤,非常简化且合理
while (pmove != NULL) {
LinkNode* pnode = pmove;
pmove = pmove->next;
if (pnode->data < x) {
pnode->next = L->next;
L->next = pnode;
if (prex == L) {
prex = pnode;
}
}
else if (pnode->data > x) {
pnode->next = ptail->next;
ptail->next = pnode;
ptail = pnode;
}
else {
pnode->next = prex->next;
prex->next = pnode;
prex = pnode;
}
}
prex->next = px->next;
free(px);
}
int main() {
LinkList L = NULL;
creatLinkList(L);
Elemtype x;
scanf("%d", &x);
sortLinkList(L,x);
printLinklist(L);
return 0;
}