【数据结构】-单链表-单链表递增排序

直接插入法排序单链表

旧的单链表要标记当前节点和下一个要处理的节点

新的单链表要找到插入位置的前一个节点和后一个节点

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

}

 

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