5.18(以后每周更新一次c++,其他不定时发布)

作业题

先讲上次的作业题:

学校老师要将班上 N 个同学排成一队,同学被编号为 1∼N,老师采取如下方法:

  1. 先将 1 号同学安排进队伍,这时队伍只有他一个人;
  2. 2∼N 号同学依次入队,编号为i的同学入队方式为:老师指定编号为i的同学站在编号为 1∼(i−1)中某位同学的右边;
  3. 从队伍中去掉 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

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值