遗
fufhaha11.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; sturct t*p=&s; p->a=10;
|
3.链表:(单链表用一个指针相连,双链表感觉每个节点前面多个指向前面一个节点next的prior,就通过这个相互连接起来,像个双向火车结,如此双链表可以正反遍历,而单链表只能正遍历)
感觉就是一连串分散的数据,通过指针有序的串联了起来,如果要插入哪个部分或者删除哪个部分,直接把那部分的指针切到所需部分即可。
一个链表的节点包括2部分[data]数据部分和[next]部分,next是用来指向下一节的指针
1 2 3 4 5
| typedef struct node{ int date; struct node*next; }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; }node;
node*head,*middle,*last;
head=(node*)malloc(sizeof(node)); middle=(node*)malloc(sizeof(node)); last=(node*)malloc(sizeof(node));
head->data=10; middle->data=20; last->data=30;
head->next=middle; middle->next=last; last->next=null;
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=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;
int main(){ int n,t; double num; cin>>n>>t; cin>>num; return 0; }
|