C++ 为什么代码在大于10的输入上给出分段错误?

C++ 为什么代码在大于10的输入上给出分段错误?,c++,debugging,gdb,C++,Debugging,Gdb,我正在建造AVL树。当我给出的输入低于10时,效果很好。但当我给出的值大于10时,代码就会崩溃,说是分段错误,并给出错误的输出。这是我的学校作业 输入是这种格式 D13 D60 D76 D12 A17 D98 A94 D70 D3 A23 A42 D45 A100 D50 A99 A22 A87 A4 A90 D88 A71 A20 D39 D83 A97 A56 D28 A9 D43 A19 D5 A11 A54 A73 D54 A9 A24 A58 D6 D80 A72 A47 A82 A1

我正在建造AVL树。当我给出的输入低于10时,效果很好。但当我给出的值大于10时,代码就会崩溃,说是分段错误,并给出错误的输出。这是我的学校作业

输入是这种格式

D13 D60 D76 D12 A17 D98 A94 D70 D3 A23 A42 D45 A100 D50 A99 A22 A87 A4
A90 D88 A71 A20 D39 D83 A97 A56 D28 A9 D43 A19 D5 A11 A54 A73 D54 A9 A24 A58 D6 D80 A72 A47 A82 A12 A75 D77 D84 D86 A60 D64 D70 D70 A73 A71 A40 D94 D27 A63 D47 A42 A44 A27 A100 A6 D84 A19 D65 A75 A55 A63 A39 D99 A50 D98 A98 D100 D93 A91 A81 D59 D56 D29 D11 D45 D47 D55 D85 D7 D70 A13 A55 A25 D35 D65 A48 D55 A45 D29 A35 A15 IN
输出结果如下所示:

4 6 9 12 13 15 17 19 20 22 23 24 25 27 35 39 40 42 44 45 48 50 58
60 63 71 72 73 75 81 82 87 90 91 97 98
#包括
#包括
使用名称空间std;
/*首先,我们将设计节点的结构*/
结构节点{
Node*l=NULL;//节点的r
Node*r=NULL;//节点的l
int h=0;//节点的高度
int d=0;//节点的数据部分
};
Node*getNode(int d){
Node*Node=新节点();
节点->d=d;
节点->l=NULL;
节点->r=NULL;
节点->h=1;
返回(节点);
}
int getH(Node*n){//获取树的高度
如果(n==NULL)
返回0;
返回n->h;
}
int getBlnc(节点*n){
如果(n==NULL)
返回0;
否则{
返回getH(n->l)-getH(n->r);
}
}
int havMaxValue(int j,int k){
如果(j>k)
返回j;
返回k;
}
/*AVL旋转*/
Node*rR(Node*temNode)//右旋转{
节点*x=temNode->l;
x->r=temNode;
temNode->l=x->r;
temNode->h=havMaxValue(getH(temNode->l),getH(temNode->r))+1;
x->h=havMaxValue(getH(x->l),getH(x->r))+1;
返回x;
}
Node*lR(Node*TempNode)//LeftRotate
{
节点*tempNode2=TempNode->r;
节点*TemNode1=TEMNODE2->l;
tempNode2->l=TempNode;
TempNode->r=TemNode1;
TempNode->h=(havMaxValue(getH(TempNode->l),getH(TempNode->r))+1;
tempNode2->h=(havMaxValue(getH(tempNode2->l),getH(tempNode2->r))+1);
返回tempNode2;
}
Node*inNode(Node*tempNode,int值)//插入新节点
{
if(tempNode==NULL)
返回(getNode(value));
if(值d)
tempNode->l=inNode(tempNode->l,值);
else if(值>临时节点->d)
tempNode->r=inNode(tempNode->r,值);
其他的
返回临时节点;
tempNode->h=1+havMaxValue(getH(tempNode->l),getH(tempNode->r));
int blnc=getBlnc(tempNode);//平衡变量
如果(blnc>1&&valuel->d)
返回rR(tempNode);
如果(blnc<-1&&value>tempNode->r->d)
返回lR(tempNode);
如果(blnc>1&&value>tempNode->l->d){
tempNode->l=lR(tempNode->l);
返回rR(tempNode);
}
如果(blnc<-1&&valuer->d){
tempNode->r=rR(tempNode->r);
返回lR(tempNode);
}
返回临时节点;
}
/*删除*/
Node*nodeHavingMinVal(Node*temp)//最小值节点
{
节点*tempNode=temp;
while(tempNode->l!=NULL)
tempNode=tempNode->l;
返回临时节点;
}
Node*extractNode(Node*tempNode,int键)//DeleteNode
{
if(tempNode==NULL)
返回临时节点;
if(键d)
tempNode->l=extractNode(tempNode->l,键);
否则如果(键>临时节点->d)
tempNode->r=extractNode(tempNode->r,键);
否则{
如果((tempNode->l==NULL)| |(tempNode->r==NULL)){
节点*TempNode=TempNode->l?TempNode->l:TempNode->r;
if(TempNode==NULL){
TempNode=TempNode;
tempNode=NULL;
}
其他的
*tempNode=*tempNode;
}
否则{
Node*TempNode=nodeHavingMinVal(TempNode->r);
tempNode->d=tempNode->d;
tempNode->r=extractNode(tempNode->r,tempNode->d);
}
}
if(tempNode==NULL)
返回临时节点;
tempNode->h=1+max(getH(tempNode->l),getH(tempNode->r));
int blnc=getBlnc(tempNode);
如果(blnc>1&&getBlnc(tempNode->l)>=0)
返回rR(tempNode);
如果(blnc>1&&getBlnc(tempNode->l)<0){
tempNode->l=lR(tempNode->l);
返回rR(tempNode);
}
如果(blnc<-1&&getBlnc(tempNode->r)r)>0){
tempNode->r=rR(tempNode->r);
返回lR(tempNode);
}
返回临时节点;
}
/*图遍历*/
空柱(节点*节点)
{
if(node==NULL)
返回;
POST(节点->l);
POST(节点->r);
cout d l);
cout d r);
}
void PRE(节点*节点)
{
if(node==NULL)
返回;
cout d l);
PRE(节点->r);
}
int main()
{
Node*root=NULL;
char-ch[5];
int-num;
int i=1;
顶部:
对于(;i>0;){
cin>>ch[0];
如果(ch[0]=='A'){
int-num;
cin>>num;
root=inNode(root,num);
转到顶端;
}
如果(ch[0]=='D'){
int-num;
cin>>num;
root=extractNode(root,num);//删除节点
if(root==NULL){
cout>ch[1];
if(ch[0]==“I”和ch[1]==“N”){
在(根);
打破
}
cin>>ch[2];
if(ch[0]=“P”和ch[1]=“R”和ch[2]=“E”){
前(根);
打破
}
cin>>ch[3];
if(ch[0]=“P”和ch[1]=“O”和ch[2]=“S”和ch[3]=“T”)
{
职位(根);
打破
}
}
返回0;
}

您的树变得无效,导致
extractNode
调用自身的次数不限,并导致堆栈溢出。检查出错的最简单方法是编写一个函数遍历整个树并调用它(通过日志记录)每次修改之后。SEGFULT之前的最后一次修改就是问题所在

您可以通过如下方式修改代码来确认这一点:

Node* extractNode(Node* tempNode, int key, int depth) //DeleteNode
{
if (depth > 10)
    printf("depth=%d\n", depth);

if (tempNode == NULL)
    return tempNode;

if (key < tempNode->d)
    tempNode->l = extractNode(tempNode->l, key, depth + 1);

else if (key > tempNode->d)
    tempNode->r = extractNode(tempNode->r, key, depth + 1);

else {
    if ((tempNode->l == NULL) || (tempNode->r == NULL)) {
        Node* TempNode = tempNode->l ? tempNode->l : tempNode->r
Node*extractNode(Node*tempNode,int-key,int-depth)//DeleteNode
{
如果(深度>10)
printf(“深度=%d\n”,深度);
if(tempNode==NULL)
返回临时节点;
if(键d)
tempNode->l=extractNode(tempNode->l,键,深度
Node* extractNode(Node* tempNode, int key, int depth) //DeleteNode
{
if (depth > 10)
    printf("depth=%d\n", depth);

if (tempNode == NULL)
    return tempNode;

if (key < tempNode->d)
    tempNode->l = extractNode(tempNode->l, key, depth + 1);

else if (key > tempNode->d)
    tempNode->r = extractNode(tempNode->r, key, depth + 1);

else {
    if ((tempNode->l == NULL) || (tempNode->r == NULL)) {
        Node* TempNode = tempNode->l ? tempNode->l : tempNode->r