题目链接
利用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;
}