我的功能如下:
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);
}
}
}
用于将值插入二叉树
我遇到的问题是第一个节点为null时一切正常。但是当函数必须调用它自己时,char数组不会打印它的意思。
有关如何解决此问题的任何建议吗?
编辑:添加了完整代码,未签名的整数只有字符没有问题。
struct decelerations:
#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;
答案 0 :(得分:1)
strcpy
看起来非常狡猾 - 他们看起来正在复制到(* ptr) - > rec结构中未初始化内存所指向的未分配内存。
感到惊讶的是你的代码没有崩溃。
答案 1 :(得分: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;
}
BTW:我删除了递归,因为它不需要。