11.30-12.7

12.7

1.堆:(我感觉都是树)

堆可以分为:1.二叉树 2.完全树(即构造的时候严格按照每层从左到右来的,注意是每层。否则不是)3.值:也是树(当一个节点比他所有子节点都大,这样形成的一个堆叫做最大堆。反之为最小堆)(以最大堆为例,一个个层之间是有大小递推的,但是每层没有)

堆的实现:数组

(一个树,如果把他压平,为一个数组形态就是从 上到下,从 左到右(是先从第一层开始到第二层从左到右,再到第三层从左到右)

此时:如果已知数组A和索引i,那么A[i]的父节点为A[(i-1)/2]向下取整当然,这个规律只适用于二叉树且是完全树

同理,二叉树压平一个数组,除了第0个,他第一个的子节点就是第三个和第四个:即A[i]的左子节点是A[2i+1],右子节点是A[2i+2]

2.指向结构体成员运算符->:

返回的是一个值,可以通过一个指针访问结构体中的成员(使用前要判断目标是否为空指针null)

1
2
3
4
5
6
struct t{
int a;
int b;
}s;//创建一个该结构体变量为s
sturct t*p=&s;//&s取得s变量在内存中的地址,指针p就指向变量s的地址
p->a=10;//将s变量的成员赋值为10(访问成员)(可以理解为p即地址s的a=10,把->理解为“的”)

3.链表:(单链表用一个指针相连,双链表感觉每个节点前面多个指向前面一个节点next的prior,就通过这个相互连接起来,像个双向火车结,如此双链表可以正反遍历,而单链表只能正遍历)

感觉就是一连串分散的数据,通过指针有序的串联了起来,如果要插入哪个部分或者删除哪个部分,直接把那部分的指针切到所需部分即可。

一个链表的节点包括2部分[data]数据部分和[next]部分,next是用来指向下一节的指针

1
2
3
4
5
//这部分是链表节点的结构体
typedef struct node{
int date;//前面的数据类型根据所需具体要填入的内容而定
struct node*next;//这里数据类型struct node ,这部分用于指向下一个节点,next填入下一节点的数据data部分
}node;

链表的操作都是从头指针开始直到最后一个节点指针指向null

删除的时候直接让上一个节点指针指向下一个节点即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
typedef struct node{
int date;//前面的数据类型根据所需具体要填入的内容而定
struct node*next;//这里数据类型struct node ,这部分用于指向下一个节点,next填入下一节点的数据data部分
}node;
//创建3个链表指针先
node*head,*middle,*last;
//下面即一个个节点的 地址
head=(node*)malloc(sizeof(node));//malloc? 锚点
middle=(node*)malloc(sizeof(node));
last=(node*)malloc(sizeof(node));
//赋值data
head->data=10;
middle->data=20;
last->data=30;
//通过next连接起来,应该是都是地址之间的转换这里面
head->next=middle;
middle->next=last;
last->next=null;
//到这里,已经是一个有3个节点的链表了
//接下来是通过头指针来获取链表中的每个值
//先创建一个临时指针temp,把头节点的地址分配给它
node*temp=head;//从头开始
while(temp!=null){
cout<<temp->data//这里还有,->访问的是前面指针创建的结构体内的成员
temp=temp->next;//地址的迭代;
}


//如果要插入值,从头部开始插入
node*head=null;
void inserthead(int e){
node*newnode=(node*)malloc(sizeof(node));//新要插入的节点的地址
newnode->data=e;
newnode->next=head;//这里即这个接下来的节点为head
head=newnode;//,此时新节点变成了头节点,最开始的“头节点”变成了最后的节点
}//注意,输入先则越后

施工中……

因为有期末和四级,后续的链表的删除,搜索以及树部分的知识在以后几周慢慢再来学吧╮(╯▽╰)╭

157周赛

1.四舍五入1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<bits/stdc++.h>
using namespace std;

int main(){
int n;
cin>>n;
if(n%10>=5){
cout<<((n/10)+1)*10;

}
else{
cout<<((n/10))*10;
}
return 0;
}

2.四舍五入2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<bits/stdc++.h>
using namespace std;//下面的这个办法python里面可以搞的了,cpp没试过
//感觉可以因为那个n给出来了,把num转换成字符型,然后用for对每个字符i进行切片,搞到一个数组里面分析,如果这个i小于5,那么i-1就加1(if如果得到0,那么i-2再加1),然后删掉i以及i+n这些字符
//最后再转换回来,不对,可能还要找到一下小数点的位置

//至于怎么取四五让他最大,不论多少次,1次总是有的,每个情况试一下,最大的就输出就好了,我赌他第一次就找到最大的,不对,这样上面那个有问题
//(他四舍五入都是在小数点后进行操作)他还没说整数部分能不能为0,分一下大于小于1

//我感觉可以直接把整数部分截掉,然后小数部分直接乘n给出的最大值,再来四舍五入,看看哪个情况最大,不对,不过这里比较的时候可以用结构体,包含一个索引和数值,比较在数值里面比
//组长,这个明天我再给你,我感觉这个是最近几次第二题我可以触及到的,今天太晚了,我有点困(╯- ╰)zZ

int main(){
int n,t;
double num;
cin>>n>>t;
cin>>num;


return 0;
}