2012-03-28 62 views
0

我有沿着线功能:Ç递归函数穿过char数组

void insert(btnode **ptr, char *name, unsigned int race, unsigned int class, unsigned int id, char *guild) 
{ 
    if((*ptr) == NULL) 
    { 
     (*ptr) = (btnode*)malloc(sizeof(btnode)); 
     (*ptr)->rec = (record*)malloc(sizeof(record)); 
     (*ptr)->left=NULL; 
     (*ptr)->right=NULL; 
     strcpy((*ptr)->rec->name,name); 
     (*ptr)->rec->race = race; 
     (*ptr)->rec->class = class; 
     (*ptr)->rec->id = id; 
     strcpy((*ptr)->rec->guild, guild); 
    } 
    else 
    { 
     if((*ptr)->rec->id > id) 
     { 
      insert(&((*ptr)->left),name,race,class,id,guild); 
     } 
     else 
     { 
      insert(&((*ptr)->right),name,race,class,id,guild); 
     } 
    } 
} 

它是利用将值插入一个二叉树

时遇到的问题是,当所述第一节点是空的一切工作正常。但是当函数必须调用它自己时,char数组不会打印它的意思。

有什么建议如何解决这个问题?

编辑:完整的代码添加,没有问题,只有字符unsigned int整数。

结构减速:

#define TWOBYTEINT 16 
#define FOURBYTEINT 32 
#define MAXIMUMLINE 70 
#define FALSE 0 
#define TRUE 1 

typedef struct record 
{ 
     char name[13]; 
     unsigned int race : TWOBYTEINT; 
     unsigned int class : TWOBYTEINT; 
     unsigned int id : FOURBYTEINT; 
     char guild[30]; 
}__attribute__((packed)) record; 

typedef struct node 
{ 
     record * rec; 
     struct node *right, *left; 
}btnode; 
+1

这段代码没有意义,'if(null)'总是'false',永远不会执行正文。我想你的意思是沿着'if(!node)'...的方向?另外,你应该显示更多的代码,什么是“插入”? – hochl 2012-03-28 09:21:42

+1

这部分代码很好,你必须提供更多代码来查看是否有其他错误。 – Mario 2012-03-28 09:22:36

+0

请指定你如何创建你的节点,并解决问题@ hochl提到 – giorashc 2012-03-28 09:23:26

回答

1

strcpy看起来非常不可靠的 - 它们看上去它们复制到未分配存储器中(* PTR)指向的未初始化存储器 - > REC结构。

惊讶你的代码不会崩溃。

0

代码没有问题,只是删除一些不良习惯。 (不幸的是,我保留了打包的属性)

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

typedef struct record { 
     char name[13]; 
     unsigned race : 16; 
     unsigned class : 16; 
     unsigned id : 32; 
     char guild[30]; 
     }__attribute__((packed)) record; 

record *record_new(char *name, unsigned int race, unsigned int class, unsigned int id, char *guild); 

typedef struct node { 
     record * rec; 
     struct node *right, *left; 
     } btnode; 

void insert(btnode **ptr, char *name, unsigned int race, unsigned int class, unsigned int id, char *guild); 

void insert(btnode **ptr, char *name, unsigned int race, unsigned int class, unsigned int id, char *guild) 
{ 
    while(*ptr) { /* may need to check for (*ptr)->rec, too .. */ 
     ptr = ((*ptr)->rec->id > id) 
      ? &(*ptr)->left 
      : &(*ptr)->right; 
     } 
    (*ptr) = malloc(sizeof **ptr); 
    if (!*ptr) return; 
    (*ptr)->left=NULL; 
    (*ptr)->right=NULL; 
    /* This could cause failures elsewhere ... */ 
    (*ptr)->rec = record_new (name,race, class, id, guild); 
} 

record *record_new(char *name, unsigned int race, unsigned int class, unsigned int id, char *guild) 
{ 
    record *rec ; 
    rec = malloc(sizeof *rec); 
    if (!rec) return NULL; 
    strncpy(rec->name,name, sizeof rec->name); 
    rec->name[sizeof rec->name-1] = 0; 
    rec->race = race; 
    rec->class = class; 
    rec->id = id; 
    strncpy(rec->guild,guild, sizeof rec->guild); 
    rec->guild[sizeof rec->guild-1] = 0; 
    return rec; 
} 

顺便说一句:我删除了递归,因为它不是必需的。