将数组添加到节点n-ary树时的分段错误

时间:2017-09-10 20:29:03

标签: c data-structures tree

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

我将root设置为“/”

如果命令是mkdir / A / B / C =>在根处创建节点A,然后在B处创建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;

tree.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));



                        }

2 个答案:

答案 0 :(得分:0)

我怀疑您传入了对CREATE EVENT expired ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 MINUTES DO DELETE FROM your_table WHERE login_expires < NOW(); 函数的空节点引用,因此当您尝试访问属性searchNode时,您将遇到段错误。

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

答案 1 :(得分:0)

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

node*

在函数 node *r r=createNode(parent->child,name,type); .... ... 中,您必须检查

searchNode

在最后一行中,您返回0但返回类型为 if(curnode!=NULL) { if(curNode->name ==name){ return curNode; } }

返回node*NULL