作业题
先讲上次的作业题:
学校老师要将班上 N 个同学排成一队,同学被编号为 1∼N,老师采取如下方法:
- 先将 1 号同学安排进队伍,这时队伍只有他一个人;
- 2∼N 号同学依次入队,编号为i的同学入队方式为:老师指定编号为i的同学站在编号为 1∼(i−1)中某位同学的右边;
- 从队伍中去掉 m 个同学,其他同学位置顺序不变。
输入描述
第 1 行一个整数 N,表示有 N 个同学。
第 2∼N 行,第 i 行包含一个整数 k,表示将 i 号同学插入到 k 号同学右边。
第 N+1 行,一个整数 M,表示去掉的同学数目。
接下来 M 行,每行一个整数 x,表示将 x 号学生从队伍中移去,如果 x 号同学已经不在队列中,则忽略这一条指令。
输出描述
一行,空格隔开的若干个整数,表示队伍从左到右所有同学的编号。
样例输入 1
4
1
2
1
2
3
3
样例输出 1
1 4 2
AC代码1:
#include <iostream>
typedef long long Int;
constexpr Int MAXN = 1000;
Int a[MAXN];
Int N;
Int M;
struct Node {//定义结构体Node,里面有学号x,下一个节点的指针next,后面用于标记删除不删除的shan
Int x;
Node* next;
bool shan;
};
Node* student[MAXN];//Node指针数组,用于存储链表
int main() {
std::cin >> N;
student[1] = new Node{1, nullptr};//题目中要求先定义第一个节点
for (Int i = 2; i <= N; i++) {//输入剩下N-1个节点的位置,每次把Node指针数组中编号为i的存储为编号为k的下一个,它的下一个是当前的编号为k的下一个。相当于上一次讲的这个:
Int k;
std::cin >> k;
student[i] = student[k]->next = new Node{i, student[k]->next};
}
std::cin >> M;
for (Int _ = 1; _ <= M; _++) {//开始标记,每输入一次标记一次
Int x;
std::cin >> x;
student[x]->shan = true;
}
for (Node* p = student[1]; p; p = p->next)//输出,遇到被标记的跳过。
if (!p->shan) {
std::cout << p->x << ' ';
}
std::cout << std::endl;
return 0;
}
AC代码2:
#include <iostream>
typedef long long Int;
constexpr Int MAXN = 1000;
Int N;
Int M;
struct Node {
Int x;
bool shan;
Node* next;
};
Node student[1+MAXN];
int main() {
std::cin >> N;
for(Int xh=1;xh<=N;xh++)//先把所有节点定义出来,他们的下一个都是nullptr
student[xh]=Node{xh,false,nullptr};
for(Int i=2;i<=N;i++){//开始排序,
Int k;
std::cin>>k;
student[i].next=student[k].next;//将i节点的next指针指向k节点的next指针指向的节点
student[k].next =student+i;//将k节点的next指针指向i节点
}
std::cin>>M;
for(Int _=1;_<=M;_++){//下面的基本同AC代码1
Int x;std::cin>>x;
student[x].shan=true;
}
for (Node *p = student+1; p; p = p->next)
if (!p->shan) {
std::cout << p->x << ' ';
}
std::cout << std::endl;
return 0;
}
无类型指针:
无类型指针:void 指针,指向运行内存里面的任意一个地址,它只会指,不知道指的是什么东西。
c++里面,只有无类型指针和字符指针可以直接输出,别的指针(如Int指针)它是被自动转成字符指针的,不是直接std::cout的。
字符指针为什么可以直接输出,其他不行:方便输出字符串,
#include<iostream>
int main(){
char A[]="xushijie";
std::cout<<A;
return 0;
}这样输出的是xushijie,但是它不是直接用值输出的,而是接收了A的第一个然后一个一个输出直到找到/0