#include <iostream>
#include "LinkList.h"
using namespace std;

template <class DT>
void InsertSort_LL(LNode<DT>* L) {
    if (L == NULL || L->next == NULL) {
        return;  // 空表或只有一个结点，不需要排序
    }

    LNode<DT>* r = L->next;  // 已排序表表尾
    LNode<DT>* q = r->next;  // q为当前处理项，r的后继

    while (q) {
        LNode<DT>* p1 = L;
        LNode<DT>* p2 = p1->next;

        while (q->data >= p2->data && p2 != q) {  // 当前结点数据大于等于p2，插入点后移
            p1 = p2;
            p2 = p2->next;
        }

        if (p2 == q) {  // 当前项无须移动
            r = q;      // 有序表表尾顺移
        }
        else {       // 插入p2前面
            r->next = q->next;   // 摘除q结点
            q->next = p1->next;  // 在p1后插入结点q
            p1->next = q;
        }

        q = r->next;  // 下一个需处理的项
    }
}


int main() {
    LNode<int>* L;
    int n;

    // 创建单链表
    cout << "请输入单链表的长度：";
    cin >> n;
    InitList(L);
    CreateList_1(L, n);

    // 显示初始单链表
    cout << "初始单链表：";
    DispList(L);

    // 插入排序
    InsertSort_LL(L);

    // 显示排序后的单链表
    cout << "排序后的单链表：";
    DispList(L);

    // 销毁单链表
    DestroyList(L);

    return 0;
}