结构体指针的问题

时间:2022-01-29 10:44:51
代码如下:
#include <iostream>
using namespace std;
struct BiNode
{
int data;
BiNode *lchild,*rchild;
};
class BiSortTree
{
public:
BiSortTree(int a[],int n);  //建立查找集合a[n]的二叉排序树
~BiSortTree(){}  //释放二叉排序树中所有结点
void InsertBST(BiNode *root,BiNode *s);  //在二叉排序树中插入一个结点s
BiNode* SearchBST(BiNode *root,int k);  //查找值为k的结点
void Print();
private:
BiNode *root;  //二叉排序树的根指针
};
BiSortTree::BiSortTree(int a[],int n)
{
root=NULL;
BiNode *s;
for(int i=0;i<n;i++)
{
s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
delete s;
}
}
void BiSortTree::InsertBST(BiNode *root,BiNode *s)
{
if(root==NULL) root=s;
else if(s->data<root->data) InsertBST(root->lchild,s);
else InsertBST(root->rchild,s);
}
BiNode* BiSortTree::SearchBST(BiNode *root,int k)
{
if(root==NULL) return NULL;
else if(root->data==k) return root;
else if(k<root->data) return SearchBST(root->lchild,k);
else return SearchBST(root->rchild,k);
}
void BiSortTree::Print()
{
cout<<root->data<<endl;
}
int main()
{
cout<<"输入创建的二叉排序树的结点个数:";
int num;
cin>>num;
int *a=new int[num];
cout<<"输入各个结点上的数据:"<<endl;
for(int i=0;i<num;i++)
cin>>a[i];
BiSortTree bisort(a,num);
cout<<"二叉排序树上各点的数据如下:"<<endl;
bisort.Print();
return 0;
}
上面代码中Print函数是我加上看能不能输出的,但是运行到Print函数的时候出现内存不能读。是不是没给root指针new分配一块内存啊?我定义的结构体s指针在InsertBST给root复制的操作对不对啊?还有析构函数该怎么写呢?这么感觉挺别扭的。。。

11 个解决方案

#1


BiSortTree::BiSortTree(int a[],int n) 

root=NULL; 
BiNode *s; 
for(int i=0;i <n;i++) 

s=new BiNode; 
s->data=a[i]; 
s->lchild=s->rchild=NULL; 
InsertBST(root,s); 
delete s; //你都delete了再printf肯定不能read了、、这句注释掉

#2


删掉BiSortTree::BiSortTree(int a[],int n)构造里的delete s;

在~BiSortTree()析构里对二叉排序树的节点进行delete.

#3


引用 1 楼 sduxiaoxiang 的回复:
BiSortTree::BiSortTree(int a[],int n)
{
root=NULL;
BiNode *s;
for(int i=0;i <n;i++)
{
s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
delete s; //你都delete了再printf肯定不能read了、、这句注释掉
}
}

s指针是临时的,只是用来复制非给root的,上次问过了,s应该先释放掉才可以重新new的,问题是如何给每个结点new分配空间呢?我试了很多都不对!!!

#4


引用 2 楼 wind_breez 的回复:
删掉BiSortTree::BiSortTree(int a[],int n)构造里的delete s;

在~BiSortTree()析构里对二叉排序树的节点进行delete.

我的主要问题就是不知道在这种情况下,就是用临时的s结构体指针复制给每个结点的情况下,如何给每个结点分配内存。。。应该怎么做才对呢?

#5


引用 3 楼 leasangle 的回复:
引用 1 楼 sduxiaoxiang 的回复:
BiSortTree::BiSortTree(int a[],int n)
{
root=NULL;
BiNode *s;
for(int i=0;i <n;i++)
{
s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
delete s; //你都delete了再printf肯定不能read了、、这句注释掉
}
}

s指针是临时的,只是用来复制非给root的,上次问过了,s应该先释放掉才可以重新new的,问题是如何给每个结点new分配空间呢?我试了很多都不对!!!

s=new BiNode; 
s->data=a[i]; 
s->lchild=s->rchild=NULL; 
InsertBST(root,s); 
这不就是给每个节点new空间么。。new了然后insert到root中
析构函数中再释放这些空间。。你直接delete掉s。。相当于这段代码直接都没执行

#6


引用 3 楼 leasangle 的回复:
引用 1 楼 sduxiaoxiang 的回复:


 s指针是临时的,只是用来复制非给root的,上次问过了,s应该先释放掉才可以重新new的,问题是如何给每个结点new分配空间呢?我试了很多都不对!!!


你这里s只是指针,或者你给node写个=的重载,对*s进行操作后释放。现在这样没问题,不需要释放。

#7


引用 5 楼 sduxiaoxiang 的回复:
引用 3 楼 leasangle 的回复:
引用 1 楼 sduxiaoxiang 的回复:
BiSortTree::BiSortTree(int a[],int n)
{
root=NULL;
BiNode *s;
for(int i=0;i <n;i++)
{
s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
delete s; //你都delete了再printf肯定不能read了、、这句注释掉
}
}

s指针是临时的,只是用来复制非给root的,上次问过了,s应该先释放掉才可以重新new的,问题是如何给每个结点new分配空间呢?我试了很多都不对!!!

s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
这不就是给每个节点new空间么。。new了然后insert到root中
析构函数中再释放这些空间。。你直接delete掉s。。相当于这段代码直接都没执行

对s指针new空间后赋给某个结点,是不是该结点也相应有了一块空间?应该不是吧?而且输出的时候应该是root的递归吧,这样的话结点还是没有new空间啊?还有,重复给一个指针new空间可以吗?好像应该先释放掉才可以吧?

#8


引用 6 楼 wind_breez 的回复:
引用 3 楼 leasangle 的回复:
引用 1 楼 sduxiaoxiang 的回复:


s指针是临时的,只是用来复制非给root的,上次问过了,s应该先释放掉才可以重新new的,问题是如何给每个结点new分配空间呢?我试了很多都不对!!!


你这里s只是指针,或者你给node写个=的重载,对*s进行操作后释放。现在这样没问题,不需要释放。

但是我想通过root指针递归访问每个结点啊,每个结点并没有new空间啊,只是用new过空间的s指针给结点赋值,正确做法应该怎么做呢?

#9


void V(bTree *root)
{
 if(root!=root)
 {
    printf("%d ",root->data);
    V(root->lchild);
    V(root->rchild);
 }
}

#10


引用 9 楼 sduxiaoxiang 的回复:
void V(bTree *root)
{
if(root!=root)
{
    printf("%d ",root->data);
    V(root->lchild);
    V(root->rchild);
}
}

我知道应该这样做,问题是程序读取不了root->data,会显示内存不能读,我上面代码中还没为每个结点new空间呢,但就是不知该如何new??

#11


问题已经解决了,我自己改了如下就可以了,谢谢大家啦!
void BiSortTree::InsertBST(BiNode *&root,BiNode *s)
{
if(root==NULL)
{
root=new BiNode;
*root=*s;
}
else if(s->data<root->data)
InsertBST(root->lchild,s);
else
InsertBST(root->rchild,s);
}

#1


BiSortTree::BiSortTree(int a[],int n) 

root=NULL; 
BiNode *s; 
for(int i=0;i <n;i++) 

s=new BiNode; 
s->data=a[i]; 
s->lchild=s->rchild=NULL; 
InsertBST(root,s); 
delete s; //你都delete了再printf肯定不能read了、、这句注释掉

#2


删掉BiSortTree::BiSortTree(int a[],int n)构造里的delete s;

在~BiSortTree()析构里对二叉排序树的节点进行delete.

#3


引用 1 楼 sduxiaoxiang 的回复:
BiSortTree::BiSortTree(int a[],int n)
{
root=NULL;
BiNode *s;
for(int i=0;i <n;i++)
{
s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
delete s; //你都delete了再printf肯定不能read了、、这句注释掉
}
}

s指针是临时的,只是用来复制非给root的,上次问过了,s应该先释放掉才可以重新new的,问题是如何给每个结点new分配空间呢?我试了很多都不对!!!

#4


引用 2 楼 wind_breez 的回复:
删掉BiSortTree::BiSortTree(int a[],int n)构造里的delete s;

在~BiSortTree()析构里对二叉排序树的节点进行delete.

我的主要问题就是不知道在这种情况下,就是用临时的s结构体指针复制给每个结点的情况下,如何给每个结点分配内存。。。应该怎么做才对呢?

#5


引用 3 楼 leasangle 的回复:
引用 1 楼 sduxiaoxiang 的回复:
BiSortTree::BiSortTree(int a[],int n)
{
root=NULL;
BiNode *s;
for(int i=0;i <n;i++)
{
s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
delete s; //你都delete了再printf肯定不能read了、、这句注释掉
}
}

s指针是临时的,只是用来复制非给root的,上次问过了,s应该先释放掉才可以重新new的,问题是如何给每个结点new分配空间呢?我试了很多都不对!!!

s=new BiNode; 
s->data=a[i]; 
s->lchild=s->rchild=NULL; 
InsertBST(root,s); 
这不就是给每个节点new空间么。。new了然后insert到root中
析构函数中再释放这些空间。。你直接delete掉s。。相当于这段代码直接都没执行

#6


引用 3 楼 leasangle 的回复:
引用 1 楼 sduxiaoxiang 的回复:


 s指针是临时的,只是用来复制非给root的,上次问过了,s应该先释放掉才可以重新new的,问题是如何给每个结点new分配空间呢?我试了很多都不对!!!


你这里s只是指针,或者你给node写个=的重载,对*s进行操作后释放。现在这样没问题,不需要释放。

#7


引用 5 楼 sduxiaoxiang 的回复:
引用 3 楼 leasangle 的回复:
引用 1 楼 sduxiaoxiang 的回复:
BiSortTree::BiSortTree(int a[],int n)
{
root=NULL;
BiNode *s;
for(int i=0;i <n;i++)
{
s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
delete s; //你都delete了再printf肯定不能read了、、这句注释掉
}
}

s指针是临时的,只是用来复制非给root的,上次问过了,s应该先释放掉才可以重新new的,问题是如何给每个结点new分配空间呢?我试了很多都不对!!!

s=new BiNode;
s->data=a[i];
s->lchild=s->rchild=NULL;
InsertBST(root,s);
这不就是给每个节点new空间么。。new了然后insert到root中
析构函数中再释放这些空间。。你直接delete掉s。。相当于这段代码直接都没执行

对s指针new空间后赋给某个结点,是不是该结点也相应有了一块空间?应该不是吧?而且输出的时候应该是root的递归吧,这样的话结点还是没有new空间啊?还有,重复给一个指针new空间可以吗?好像应该先释放掉才可以吧?

#8


引用 6 楼 wind_breez 的回复:
引用 3 楼 leasangle 的回复:
引用 1 楼 sduxiaoxiang 的回复:


s指针是临时的,只是用来复制非给root的,上次问过了,s应该先释放掉才可以重新new的,问题是如何给每个结点new分配空间呢?我试了很多都不对!!!


你这里s只是指针,或者你给node写个=的重载,对*s进行操作后释放。现在这样没问题,不需要释放。

但是我想通过root指针递归访问每个结点啊,每个结点并没有new空间啊,只是用new过空间的s指针给结点赋值,正确做法应该怎么做呢?

#9


void V(bTree *root)
{
 if(root!=root)
 {
    printf("%d ",root->data);
    V(root->lchild);
    V(root->rchild);
 }
}

#10


引用 9 楼 sduxiaoxiang 的回复:
void V(bTree *root)
{
if(root!=root)
{
    printf("%d ",root->data);
    V(root->lchild);
    V(root->rchild);
}
}

我知道应该这样做,问题是程序读取不了root->data,会显示内存不能读,我上面代码中还没为每个结点new空间呢,但就是不知该如何new??

#11


问题已经解决了,我自己改了如下就可以了,谢谢大家啦!
void BiSortTree::InsertBST(BiNode *&root,BiNode *s)
{
if(root==NULL)
{
root=new BiNode;
*root=*s;
}
else if(s->data<root->data)
InsertBST(root->lchild,s);
else
InsertBST(root->rchild,s);
}