{if(!p)delete [] p;}
时间: 2023-12-18 11:04:49 浏览: 13
这是一个 C++ 语言中的代码片段,用于释放指针 p 所指向的动态分配内存空间。其中,if (!p) 表示判断指针 p 是否为空指针,如果为空指针则直接返回,不执行后续的操作;而 delete [] p 表示释放 p 所指向的数组型动态分配内存空间。需要注意的是,p 所指向的内存空间必须是通过 new [] 分配的,否则会导致未定义的行为。
相关问题
#include<iostream> using namespace std; typedef struct ElemType{ int key; }ElemType; typedef struct BSTNode{ ElemType data; BSTNode *lchild,*rchild; }BSTNode,*BSTree; int flag=1; void InsertBST(BSTree &T,ElemType e ) ;//实现细节隐藏 void CreateBST(BSTree &T ) ;//实现细节隐藏 void InOrderTraverse(BSTree &T);//中序遍历,实现细节隐藏 void DeleteBST(BSTree &T,char key) { BSTree p=T;BSTree f=NULL; BSTree q; BSTree s; while(p){ if (p->data.key == key) break; f=p; if (p->data.key> key) p=p->lchild; else p=p->rchild; } if(!p) ; if ((p->lchild)&& (p->rchild)) { q = p; s = p->lchild; while (s->rchild) {q = s; s = s->rchild;} p->data= s->data; if(q!=p) ; else ; delete s; } else{ if(!p->rchild) { q = p; p = p->lchild; } else if(!p->lchild) { q = p; p = p->rchild; } if(!f) ; else if (q==f->lchild) ; else ; delete q; } } int main() { BSTree T; CreateBST(T); int key; cin>>key; DeleteBST(T,key); InOrderTraverse(T); }补全这个代码 使他能够运转
完整代码如下:
```c++
#include<iostream>
using namespace std;
typedef struct ElemType{
int key;
}ElemType;
typedef struct BSTNode{
ElemType data;
BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
int flag=1;
void InsertBST(BSTree &T,ElemType e ) {
if(!T) {
BSTree S = new BSTNode;
S->data =e;
S->lchild = S->rchild = NULL;
T = S;
}
else if (e.key< T->data.key)
InsertBST(T->lchild, e);
else if (e.key> T->data.key)
InsertBST(T->rchild, e);
}
void CreateBST(BSTree &T ) {
int i=1,n;
cin >> n;
T=NULL;
ElemType e;
while(i<=n){
cin>>e.key;
InsertBST(T, e);
i++;
}
}
void InOrderTraverse(BSTree &T) {
if(T) {
InOrderTraverse(T->lchild);
if(flag){cout<<T->data.key;flag=0;}
else cout<<" "<<T->data.key;
InOrderTraverse(T->rchild);
}
}
void DeleteBST(BSTree &T,char key) {
BSTree p=T;
BSTree f=NULL;
BSTree q;
BSTree s;
while(p){
if (p->data.key == key) break;
f=p;
if (p->data.key> key) p=p->lchild;
else p=p->rchild;
}
if(!p) cout<<"找不到此节点"<<endl;
else if ((p->lchild)&& (p->rchild)) {
q = p;
s = p->lchild;
while (s->rchild) {
q = s;
s = s->rchild;
}
p->data= s->data;
if(q!=p) q->rchild=s->lchild;
else q->lchild=s->lchild;
delete s;
}
else{
if(!p->rchild) { q = p; p = p->lchild; }
else if(!p->lchild) { q = p; p = p->rchild; }
if(!f) T=p;
else if (q==f->lchild) f->lchild=p;
else f->rchild=p;
delete q;
}
}
int main() {
BSTree T;
CreateBST(T);
int key;
cin>>key;
DeleteBST(T,key);
InOrderTraverse(T);
return 0;
}
```
这份代码可以创建一棵二叉搜索树,并支持删除指定节点。其中,`CreateBST` 函数用于创建二叉搜索树,`InsertBST` 函数用于向二叉搜索树中插入节点,`InOrderTraverse` 函数用于中序遍历二叉搜索树并输出节点的值,`DeleteBST` 函数用于删除指定节点。
#include<stdio.h> #include<stdlib.h> typedef struct BiTNode { int key; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree; int SearchBST(BiTree T, int key, BiTree f, BiTree &p) { if (!T) { p = f; return 0; } else if (key == T->key) { p = T; return 1; } else if (key < T->key) SearchBST(T->lchild, key, T, p); else SearchBST(T->rchild, key, T, p); } int InsertBST(BiTree &T, int key) { if (!T) { T = (BiTree)malloc(sizeof(BiTNode)); T->key = key; T->lchild = (T)->rchild = NULL; } if (key == T->key) return 0; if (key > T->key) InsertBST(T->rchild, key); else InsertBST(T->lchild, key); } void InorderTraverse(BiTree T) { if (T){ InorderTraverse(T->lchild); printf("%d ", T->key); InorderTraverse(T->rchild); } } void Delete(BiTree &p) { BiTree q, s; if (!p->lchild && !p->rchild) p = NULL; else if (!p->lchild) { q = p; p = p->rchild; free(q); } else if (!p->rchild) { q = p; p = p->lchild; free(q); } else{ q = p; s = p->lchild; while (s->rchild) { q = s; s = s->rchild; } p->key = s->key; if (q != p) q->rchild = s->lchild; else q->lchild = s->lchild; free(s); } } int DeleteBST(BiTree &T, int key) { if (!T) return 0; else{ if (key == T->key) Delete(T); else if (key < T->key) DeleteBST(T->lchild, key); else DeleteBST(T->rchild, key); } } int main() { int e, n; BiTree T = NULL, f = 0, p; printf("输入长度:"); scanf("%d", &n); printf("输入元素:"); while (n--){ scanf("%d", &e); InsertBST(T, e); } printf("中序遍历:"); InorderTraverse(T); printf("\n"); while (1) { printf("输入要查找元素:"); scanf("%d", &e); if (SearchBST(T, e, f, p)) printf("找到了\n"); else printf("没找到\n"); printf("输入要插入元素:"); scanf("%d", &e); InsertBST(T, e); printf("中序遍历:"); InorderTraverse(T); printf("\n"); printf("输入要删除元素:"); scanf("%d", &e); DeleteBST(T, e); printf("中序遍历:"); InorderTraverse(T); printf("\n"); } }请帮我注视本段代码
好的,以下是本段代码的注释:
```c
#include<stdio.h>
#include<stdlib.h>
//定义二叉搜索树的节点结构体
typedef struct BiTNode
{
int key; //节点值
struct BiTNode *lchild, *rchild; //左右子节点
} BiTNode, *BiTree;
//在二叉搜索树T中查找值为key的节点,f为T的父节点,p为查找结果
int SearchBST(BiTree T, int key, BiTree f, BiTree &p)
{
if (!T)
{
p = f;
return 0; //未找到
}
else if (key == T->key)
{
p = T;
return 1; //找到
}
else if (key < T->key)
SearchBST(T->lchild, key, T, p);
else
SearchBST(T->rchild, key, T, p);
}
//在二叉搜索树T中插入值为key的节点
int InsertBST(BiTree &T, int key)
{
if (!T)
{
T = (BiTree)malloc(sizeof(BiTNode)); //申请新节点
T->key = key;
T->lchild = (T)->rchild = NULL; //左右子节点置为空
}
if (key == T->key)
return 0; //已有相同节点
if (key > T->key)
InsertBST(T->rchild, key); //插入右子树
else
InsertBST(T->lchild, key); //插入左子树
}
//中序遍历二叉搜索树
void InorderTraverse(BiTree T)
{
if (T){
InorderTraverse(T->lchild);
printf("%d ", T->key);
InorderTraverse(T->rchild);
}
}
//删除指定节点
void Delete(BiTree &p)
{
BiTree q, s;
if (!p->lchild && !p->rchild)
p = NULL;
else if (!p->lchild)
{
q = p;
p = p->rchild;
free(q);
}
else if (!p->rchild)
{
q = p;
p = p->lchild;
free(q);
}
else
{
q = p;
s = p->lchild;
while (s->rchild)
{
q = s;
s = s->rchild;
}
p->key = s->key;
if (q != p)
q->rchild = s->lchild;
else
q->lchild = s->lchild;
free(s);
}
}
//在二叉搜索树T中删除值为key的节点
int DeleteBST(BiTree &T, int key)
{
if (!T)
return 0; //未找到
else
{
if (key == T->key)
Delete(T); //找到并删除
else if (key < T->key)
DeleteBST(T->lchild, key); //在左子树中递归查找和删除
else
DeleteBST(T->rchild, key); //在右子树中递归查找和删除
}
}
//主函数
int main()
{
int e, n;
BiTree T = NULL, f = 0, p; //T为二叉搜索树,f为T的父节点,p为查找结果
printf("输入长度:");
scanf("%d", &n);
printf("输入元素:");
while (n--)
{
scanf("%d", &e);
InsertBST(T, e); //插入元素建树
}
printf("中序遍历:");
InorderTraverse(T); //中序遍历
printf("\n");
while (1)
{
printf("输入要查找元素:");
scanf("%d", &e);
if (SearchBST(T, e, f, p))
printf("找到了\n");
else
printf("没找到\n");
printf("输入要插入元素:");
scanf("%d", &e);
InsertBST(T, e); //插入元素
printf("中序遍历:");
InorderTraverse(T); //中序遍历
printf("\n");
printf("输入要删除元素:");
scanf("%d", &e);
DeleteBST(T, e); //删除元素
printf("中序遍历:");
InorderTraverse(T); //中序遍历
printf("\n");
}
}
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)