1075 链表元素分类

1075 链表元素分类,第1张

1075 链表元素分类

思路:
前面要做的事情是:读取输入,组成原链表

  • 每个链表节点用一个结构体表示,结构体内三个参数,分别是当前节点的地址add、值val,以及是否已经被提取为答案链表ext。


  • 创建两个结构体数组L和ans,分别代表原链表和新链表
  • 创建2个map,对应关系分别是:
    (1)ne:当前地址——下个节点地址
    (2)val:当前地址——值

接下来要做的是从原链表中提取节点组成新链表

  • 用三次for循环分别抽取小于0的节点,小于等于K的节点,以及其他节点加入答案链表。


    抽取后的节点的ext值设为-1。


#include
#include
#include

using namespace std;

struct node {
	int add;
	int val;
	int ext;
} L[100005], ans[100005];

map<int, int>ne, val;

int main(void) {
	int add, n, k; cin >> add >> n >> k;
	for (int i = 0; i < n; i++) {
		int a, x, b; cin >> a >> x >> b;
		ne[a] = b;
		val[a] = x;
	}
	int index = 0;
	while (1) {
		L[index].add = add;
		L[index].val = val[add];
		index++;
		add = ne[add];
		if (add == -1) { break; }
	}
	n = index;
	index = 0;
	for (int i = 0; i < n; i++) {  // 提取值小于0的节点
		if (L[i].val < 0) {
			ans[index++] = L[i];
			L[i].ext = -1;
		}
	}
	for (int i = 0; i < n; i++) {  // 提取值小于等于K的节点
		if (L[i].val <= k && L[i].ext != -1) {
			ans[index++] = L[i];
			L[i].ext = -1;
		}
	}
	for (int i = 0; i < n; i++) {  // 提取其他节点
		if (L[i].ext != -1) { ans[index++] = L[i]; }
	}

	for (int i = 0; i < n; i++) {  // 输出答案链表
		if (i + 1 != n) {  // 假如不是最后一个链节点
			printf("%05d %d %05d\n", ans[i].add, ans[i].val, ans[i + 1].add);
		}
		else { // 假如是最后一个链节点(没有L[i+1]了)
			printf("%05d %d -1", ans[i].add, ans[i].val);
		}
	}
	return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/568789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存