创建一个BST节点具有相同值的字符串

时间:2013-08-11 17:47:48

标签: c string binary-search-tree

我有一个类似(BST)的结构:

typedef struct node {
  char* name;  
  int age;
  struct node* left;       
  struct node* right;      
} node_t;

我要创建一个函数:char* getSameAge(node_t* s, int age)返回一个字符串,如name1:name2:.... nameN,其节点具有== age

我做了这个解决方案,它适用于测试,但是使用valgrind它给了我错误......有没有人给我一个建议或替代/更好的解决方案?!

void visitTree(node_t* s,char buf[N],int age) {
  if(s!=NULL) {
    visitTree(s->left,buf,age);
    if(s->age == age) {
      if(strlen(buf) == 0) strcpy(buf,s->name);
      else{
       strcat(buf,s->name);
       if(s->left != NULL || s->right != NULL) strcat(buf,":");
      }
    }
    visitTree(s->right,buf,age);
  }
}

char* getSameAge(node_t* s, int age) {

  char buf[N];
  visitTree(r,buf,age);
  if(strlen(buf) == 0) {
    return NULL;
  }
  else {
    char *aux = malloc(strlen(buf));
    strcpy(aux,buf);
    return aux;
  }
}

1 个答案:

答案 0 :(得分:0)

1。以下行有错误(可能是其他人,但这肯定是其中之一):

char *aux = malloc(strlen(buf));

召回: strlen返回字符串长度,缺少aux的NULL终止符(因为strcpy将复制所有内容 em> NULL终结符。)

应该如下:

char *aux = malloc( sizeof( char ) * ( strlen( buf ) + 1 ) );

2. 更改以下行:

char buf[N];

......如下:

char buf[N] = { 0 };

...通过不将数组中的每个元素初始化为0(或NULL终结符 - '\ 0'),buf将从前一个堆栈帧中获取任意值。

旁白:我相信你真正所有必须做的就是解决 2 错误,确保{{1}的第一个元素这只 是有效的,因为你只使用bufstrcpy将NULL终止符从源字符串复制到目标字符串。