1075 链表元素分类

题目链接
利用c++做:
将结点用list[10000]保存,list为node类型,node中保存结点的值value和它的next地址。list的下标就是结点的地址。将<0、0~k、>k三部分的结点地址分别保存在v[0]、v[1]、v[2]中,最后将vector中的值依次输出

#pragma warning(disable:4996);
#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<stack>
#include<math.h>
#include<vector>
using namespace std;
struct {
	int data;
	int next;
}list[100000];//利用地址做元素下标存值;
vector <int> v[3];//分别来存取值在<0 0-k >k 的元素节点地址;
//vector<int> v[3]是3行的二维数组,
//你可以理解为,int arr[3]是建立一个3个元素的一维数组,
//每个元素是一个int。
//那么vector<int> v[3]就是建立一个有三个元素的数组,
//每个元素是一个vector。vector<int> v(3)是3个元素的一维数组
int main() {
	int start, n, k, a;//n 节点个数,k 题目的K值
	scanf("%d%d%d", &start, &n, &k);
	for (int i = 0;i < n;i++)
	{
		scanf("%d", &a);
		scanf("%d%d", &list[a].data, &list[a].next);
	}
	int p = start;
	while (p != -1)
	{//根据data值来划分进入哪个区域;
		int data = list[p].data;
		if (data < 0) v[0].push_back(p);
		else if (data >= 0 && data <= k) v[1].push_back(p);
		else v[2].push_back(p);
		p = list[p].next;
	}
	int flag = 0;//控制格式
	for (int i = 0;i < 3;i++)
	{
		for (int j = 0;j < v[i].size();j++)
		{
			if (flag == 0) {
				printf("%05d %d ", v[i][j], list[v[i][j]].data);
				flag = 1;
			}//输出要符合,地址,值,下一个节点地址;
			else {
				printf("%05d\n%05d %d ", v[i][j], v[i][j], list[v[i][j]].data);
			}
			//printf("%05d %d %05d\n", v[i][j], list[v[i][j]].data, list[v[i][j]].next);不能这么写因为最后一个节点地址是-1,
			//而我们实际并没有存,因为不是一个下标,而这样写,会导致最后一个节点下移地址随意输出一个值
		
		}
	}
	printf("-1");//单独控制输出;
	return 0;
}

c语言:

#pragma warning(disable:4996);
#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<stack>
#include<math.h>
#include<vector>
using namespace std;
struct {
	int data;
	int next;
}list[100000];//利用地址做元素下标存值;
//vector <int> v[3];//分别来存取值在<0 0-k >k 的元素节点地址;
//vector<int> v[3]是3行的二维数组,
//你可以理解为,int arr[3]是建立一个3个元素的一维数组,
//每个元素是一个int。
//那么vector<int> v[3]就是建立一个有三个元素的数组,
//每个元素是一个vector。vector<int> v(3)是3个元素的一维数组
int v[3][100000];
int main() {
	int start, n, k, a;//n 节点个数,k 题目的K值
	scanf("%d%d%d", &start, &n, &k);
	for (int i = 0;i < n;i++)
	{
		scanf("%d", &a);
		scanf("%d%d", &list[a].data, &list[a].next);
	}
	int p = start;
	int t1, t2, t3;//用来赋值;
	t1 = t2 = t3 = 0;
	while (p != -1)
	{//根据data值来划分进入哪个区域;
		int data = list[p].data;
		if (data < 0) v[0][t1++] = p;
		else if (data >= 0 && data <= k) v[1][t2++] = p;
		else v[2][t3++] = p;
		p = list[p].next;
	}
	int flag = 0;//控制格式
	//不能像上面那么写了,得拆开分别输出;
		for (int j = 0;j < t1;j++)
		{
			if (flag == 0) {
				printf("%05d %d ", v[0][j], list[v[0][j]].data);
				flag = 1;
			}//输出要符合,地址,值,下一个节点地址;
			else {
				printf("%05d\n%05d %d ", v[0][j], v[0][j], list[v[0][j]].data);
			}
			//printf("%05d %d %05d\n", v[i][j], list[v[i][j]].data, list[v[i][j]].next);不能这么写因为最后一个节点地址是-1,
			//而我们实际并没有存,因为不是一个下标,而这样写,会导致最后一个节点下移地址随意输出一个值
		}
		for (int j = 0;j < t2;j++)
		{
			if (flag == 0) {
				printf("%05d %d ", v[1][j], list[v[1][j]].data);
				flag = 1;
			}//输出要符合,地址,值,下一个节点地址;
			else {
				printf("%05d\n%05d %d ", v[1][j], v[1][j], list[v[1][j]].data);
			}
			//printf("%05d %d %05d\n", v[i][j], list[v[i][j]].data, list[v[i][j]].next);不能这么写因为最后一个节点地址是-1,
			//而我们实际并没有存,因为不是一个下标,而这样写,会导致最后一个节点下移地址随意输出一个值
		}
		for (int j = 0;j < t3;j++)
		{
			if (flag == 0) {
				printf("%05d %d ", v[2][j], list[v[2][j]].data);
				flag = 1;
			}//输出要符合,地址,值,下一个节点地址;
			else {
				printf("%05d\n%05d %d ", v[2][j], v[2][j], list[v[2][j]].data);
			}
			//printf("%05d %d %05d\n", v[i][j], list[v[i][j]].data, list[v[i][j]].next);不能这么写因为最后一个节点地址是-1,
			//而我们实际并没有存,因为不是一个下标,而这样写,会导致最后一个节点下移地址随意输出一个值
		}
	printf("-1");//单独控制输出-1;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值