2012-03-28 83 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; 
} 

順便說一句:我刪除了遞歸,因爲它不是必需的。