将带头单链表所有小于x的元素都排在前面,所有大于x的元素都排在后面

算法思想:构建一个只含头节点新表,在新表中插入一个值为x的临时节点,在完成操作之后再将其删除。依次访问链表中的每一个数据节点,如果当前访问节点小于x,则将其插入链表头;如果当前节点大于x,则将其插入链表尾;如果当前节点等于x,则将其插入到临时节点之前,同时更新临时节点的前驱;重复上述步骤,直到所有数据节点停止,最后删除临时节点。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct LinkNode {
	Elemtype data;
	struct LinkNode* next;
}LinkNode, * LinkList;
void creatLinkList(LinkList& L) {
	L = (LinkNode*)malloc(sizeof(LinkNode));
	L->next = NULL;
	LinkNode* ptail = L;
	int num;
	while (scanf("%d", &num) && num < 99999) {
		LinkNode* pnode = (LinkNode*)malloc(sizeof(LinkNode));
		pnode->data = num;
		pnode->next = ptail->next;
		ptail->next = pnode;
		ptail = pnode;
	}
}
void printLinklist(LinkList L) {
	LinkNode* pnode = L->next;
	while (pnode != NULL) {
		printf("%d ", pnode->data);
		pnode = pnode->next;
	}
	printf("\n");
}
/*构建一个只含头节点新表,在新表中插入一个值为x的临时节点,在完成操作之后再将其删除。
依次访问链表中的每一个数据节点,如果当前访问节点小于x,则将其插入链表头;如果当前节点大于x,则将其插入链表尾;
如果当前节点等于x,则将其插入到临时节点之前,同时更新临时节点的前驱;重复上述步骤,直到所有数据节点停止,最后删除临时节点*/
void sortLinkList(LinkList L, Elemtype x) {
	LinkNode* pmove = L->next;
	L->next = NULL;
	LinkNode* px = (LinkNode*)malloc(sizeof(LinkNode));
	px->data = x;
	px->next = L->next;
	L->next = px;
	LinkNode* prex = L;
	LinkNode* ptail = px;
	//注意下面元素插入的处理步骤,非常简化且合理
	while (pmove != NULL) {
		LinkNode* pnode = pmove;
		pmove = pmove->next;
		if (pnode->data < x) {
			pnode->next = L->next;
			L->next = pnode;
			if (prex == L) {
				prex = pnode;
			}
		}
		else if (pnode->data > x) {
			pnode->next = ptail->next;
			ptail->next = pnode;
			ptail = pnode;
		}
		else {
			pnode->next = prex->next;
			prex->next = pnode;
			prex = pnode;
		}
	}
	prex->next = px->next;
	free(px);
}
int main() {
	LinkList L = NULL;
	creatLinkList(L);
	Elemtype x;
	scanf("%d", &x);
	sortLinkList(L,x);
	printLinklist(L);
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值