直接插入法排序单链表
旧的单链表要标记当前节点和下一个要处理的节点
新的单链表要找到插入位置的前一个节点和后一个节点
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
/*链表*/
LinkList List_TailInsert(LinkList L) {
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LNode *s, *r = L;
cout << "尾插法创建单链表:";
while (true) {
cin >> x;
s = (LNode*)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
if (cin.get() == '\n')break;
}
r->next = NULL;
return L;
}
void List_Print(LinkList L) {
LNode *p;
p = L->next;
while (p) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
LinkList Paixu(LinkList L) {
if (L->next == NULL) return L;
LNode *p = L->next;
LNode *q = p;
LNode *r;
LNode *pre = L;
L->next = NULL;//断开旧的单链表,形成新的单链表的头结点
while (q)//q遍历旧的单链表
{
p = q;//处理一个新的节点
q = p->next;//记录旧链表中的下一个待处理节点
r = pre->next;
while (r!=NULL&&p->data > r->data)//更新新链表插入的位置
{
pre = r;
r = r->next;
}
pre->next = p;//插入
p->next = r;
pre = L;//更新新链表遍历的起点
}
return L;
}
int main()
{
LinkList L=NULL;
LNode *p;
L=List_TailInsert(L);
List_Print(L);
L = Paixu(L);
List_Print(L);
}