【數據結構】-單鏈表-單鏈表遞增排序

直接插入法排序單鏈表

舊的單鏈表要標記當前節點和下一個要處理的節點

新的單鏈表要找到插入位置的前一個節點和後一個節點

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);

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章