【问题标题】:segmentation fault when adding array to a node n-ary tree将数组添加到节点 n 叉树时出现分段错误
【发布时间】:2017-09-10 20:29:02
【问题描述】:

我正在尝试创建一个 N 元树,其中我有一个 char 数组 ex: {A,B,C,D} 要插入到树中。

我将根设置为“/”

如果命令是 mkdir /A/B/C => 在根目录创建节点 A,然后在 A 和 B 在 B 上创建节点。如果命令是 mkdir B/C/D =>在 C 中创建节点 D,等等...我简化了下面的代码,希望这里不会有任何错字。无论如何,在使用 gdb 进行调试时,看起来在到达搜索功能时会给我一个分段错误,我编写了下面的代码,我很确定插入功能也会有同样的错误,但我一直没能测试一下。

head.c

#pragma once
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define len 128
#define num 128

typedef struct tree{
    char name;
    char type;
    struct node *child, *sibbling, *parentNode;

}node;
char  *baseName[64];
node *root, *cwd;

树.c

node *createNode(node * newNode, char ch, char ty){

            node *curNode = (node*)malloc(sizeof(node));
            curNode->name = ch;
            curNode->type = ty;
            curNode->parentNode = newNode;
            curNode->sibbling = curNode->child=NULL;
            return curNode;

        }


node * insertNode(node *parent, char name, char type){

                if(parent->child == NULL){
                    parent->child=parent;
                    createNode(parent->child,name,type);
                }

                else{
                    parent->sibbling = parent;
                    createNode(parent->sibbling,name,type);

                }
            }

node *searchNode(node *curNode, char name){

    if(curNode->name ==name){  <------------error here
            return curNode;
    }

    if(name != curNode->name && curNode->sibbling != '\0'){
         searchNode(curNode->sibbling, name);
    }

    if(name != curNode->name && curNode->child != '\0'){
         searchNode(curNode->sibbling, name);
                }
    return 0;       
}


void mkDir(){
    int index = 0;
    int flag =0;
    int baseFlag=0;

    node *pwd = root;

          ///// insert
           while(dirName[index] !='\0'){
              if(searchNode(root,dirName[index]) != NULL){ <-- error in this searchNode function //no node exist
                       // insertNode(pwd,"A","D"); <---this probably error too
                        printf("found A");
                 }

                   else{
                      //node exist
                      cwd = searchNode(root,dirName[index]);
                      insertNode(cwd,dirName[index],"D");

                  }
               index++;
               }  
    }



    memset(dirName,'\0',sizeof(dirName));



                        }

【问题讨论】:

  • 您写道:“我简化了下面的代码,希望这里不会有任何拼写错误”。你为什么不检查这个简化的代码是否编译并实际重现了问题?请阅读:minimal reproducible example
  • curNode-&gt;sibbling != '\0'){ 你在这里混淆了 NULL 和 0。
  • typedef struct tree{ --> typedef struct node{

标签: c data-structures tree


【解决方案1】:

我怀疑您将空节点引用传递给searchNode 函数,因此当您尝试访问属性name 时会遇到段错误。

我建议在您的代码中测试和处理空引用。

【讨论】:

    【解决方案2】:

    函数createNode返回类型为node*。在函数insertNode中,您必须将new nodeaddress存储在node*类型的其他变量中。

                  node *r
                  r=createNode(parent->child,name,type);
                  ....
                  ...
    

    在函数searchNode你必须检查

       if(curnode!=NULL)  {
           if(curNode->name ==name){
            return curNode;
      }
     }
    

    在最后一行你返回 0 但返回类型是node*

    返回NULL(node*)0

    【讨论】:

      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多