使用malloc函数,需要调用头文件# include <malloc.h>
malloc函数的作用是动态分配内存,以解决静态内存定长、不能手动释放等缺陷。
malloc的使用方法:
int *p = (int *)malloc(sizeof(int));
*p = 1;
free(p);
其中,p为一个整型指针变量,由int *p = (int*)malloc(sizeof(int))可以看出来,这句话在给*p分配内存.
malloc函数支持一个形参(该形参就是字节大小),而sizeof(int)计算出了我们需要的字节数,malloc函数的返回值是一个地址,把分配的动态内存的地址赋给指针p,就是在为*p开辟了一块动态内存。
free(p)则是释放了p所指向的内存。
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <malloc.h>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
struct Node {//结点
int data;
Node *left;
Node *right;
};
struct Tree {//树的根结点指针
Node *root;
};
void insert(Tree *tree, int value) { //插入结点
//首先把value打包成一个结点
Node *node = (Node *)malloc(sizeof(Node));//malloc 当程序退出的时候 node 不会被内存销毁
node -> data = value;
node -> left = NULL;
node -> right = NULL;
if (tree -> root == NULL) {//当树根为空时,插入树根结点
tree -> root = node;
} else {//树根不为空时
Node *temp = tree -> root;//寻找合适的位置插入新的结点
while (temp != NULL) {
if (temp ->data > value) {//需要插入的数值比当前结点大
if (temp -> left == NULL) {//找到合适的位置,插入值,并返回
temp -> left = node;
return ;
} else {//往树的左边找
temp = temp -> left;
}
} else {
if (temp -> right == NULL) {//需要插入的数值比当前结点小
temp -> right = node;//找到合适的位置,插入值,并返回
return ;
} else {//往树的右边找
temp = temp -> right;
}
}
}
}
}
void preorder(Node *node) {//前序遍历(根 左 右),先输出
if (node != NULL) {
printf("%d\n", node->data);
preorder(node->left);
preorder(node->right);
}
}
void inorder(Node *node) {//中序遍历(左 右 根),中间输出
if (node != NULL) {//中序遍历是从小到大排序的
inorder(node -> left);
printf("%d\n", node -> data);
inorder(node->right);
}
}
void postorder(Node *node) {//后序遍历(左 右 根),最后输出
if (node != NULL) {
postorder(node -> left);
postorder(node -> right);
printf("%d\n", node -> data);
}
}
int main() {
int a[10] = {6, 3, 8, 2, 5, 1, 7};
Tree tree;
tree.root = NULL;
for (int i = 0; i < 7; i++ )
insert(&tree, a[i]);
inorder(tree.root);
return 0;
}