直接插入法排序單鏈表
舊的單鏈表要標記當前節點和下一個要處理的節點
新的單鏈表要找到插入位置的前一個節點和後一個節點
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);
}