我正在尝试实现自适应霍夫曼代码,但在尝试构建树时,在执行“currentNYT-> lchild = newNYT”行时的代码时出现分段错误在addnode()函数中。
有人可以帮帮我吗?这可能是我不知道的简单事情。现在没有使用C一段时间了。
//variable and type declarations
struct treeElement {
unsigned long weight;
unsigned short id;
char chr;
struct treeElement *lchild, *rchild, *parent;
};
typedef struct treeElement node;
node *root, *currentNYT;
//functions
void initTree() {
root = NULL;
currentNYT = malloc(sizeof(node));
currentNYT = root;
} //initTree
void addNode(char newNodeChr) {
node *newNYT, *newExternal;
newNYT = malloc(sizeof(node));
newNYT->id=maxNodes-idCount; idCount++;
newNYT->chr='\0';
newNYT->weight=0;
newNYT->parent=currentNYT;
newNYT->lchild=newNYT->rchild=NULL;
newExternal = malloc(sizeof(node));
newExternal->id=maxNodes-idCount;
newExternal->chr=newNodeChr;
newExternal->weight=1;
newExternal->parent=currentNYT;
newExternal->lchild=newExternal->rchild=NULL;
currentNYT->lchild = newNYT;
currentNYT->rchild = newExternal;
currentNYT=newNYT;
} //addNode
答案 0 :(得分:0)
root = NULL;
currentNYT = malloc(sizeof(node));
currentNYT = root;
嗯,你将currentNYT设置为NULL。你的意思是:
root = currentNYT;
代替?
您可能也想要初始化该节点的元素。哦,也许检查一下malloc成功了吗?
可能更清楚
root = malloc(sizeof(node));
if (!root) {
/* panic! */
}
root->.... = whatever; /* for each of the elements of the struct */
currentNYT = root;
答案 1 :(得分:0)
看看这个:
root = NULL;
currentNYT = malloc(sizeof(node));
currentNYT = root;
您将root
设置为NULL
,然后将currentNYT
设置为root
。因此,currentNYT
始终为NULL
。
答案 2 :(得分:0)
以下似乎是第一个错误...
currentNYT = malloc(sizeof(node));
currentNYT = root;
可能想要
root = malloc(sizeof(node));
currentNYT = root;
代替
答案 3 :(得分:0)
是删除currentNYT = root会让我摆脱段错误但不幸的是它不会做我想要的。
我想初始化我的树。对于NULL子项,根将为空。 currentNYT最初将指向root。
addNode()将始终向currentNYT节点添加两个新的子节点。左子节点将是newNYT,右节点将是具有作为函数参数发送的值的节点。 addNode()的下一次调用将执行相同的操作,但是两个新节点的父节点将是newNYT,因此在第一次调用addNode()之后currentNYT必须指向newNYT。
currentNYT将始终指向将在下次调用addNode()时充当父节点的节点。
我真的希望有人可以提供帮助。