我正在实现一种使用以下结构作为节点
的存储桶堆栈struct NodeBucket {
char** val;
struct NodeBucket* next;
};
它应该工作的方式是每个存储桶可以保存指定数量的值,当创建一个新的NodeBucket并链接到之前然后填充等等。
在尝试向第一个存储桶添加第二个值时,我遇到了困惑。当我添加第一个值时,我创建第一个存储桶,使用temp->value = &val
将值设置为输入。现在我不确定如何添加其余的输入。我尝试过使用索引(firstBucket-> val [1] = val),但这似乎不是正确的方法。我将不胜感激任何帮助。是的,这是家庭作业,我是C的相对初学者,来自Python。
修改
void push(char* val, struct Stack *stack){
if (isEmpty(stack)){
struct NodeBucket *temp =malloc(sizeof(struct NodeBucket));
temp ->val = &val;
temp->next = NULL;
stack->firstBucket=temp;
stack->topElt++;
}else if(!isEmpty(stack)&& size(stack)!=stack->bucketSize){
stack->firstBucket->val[stack->topElt] = val;
stack->topElt++;
}
答案 0 :(得分:0)
它应该起作用的方式是每个桶可以容纳指定数量的值,
因此,您的存储区必须具有足够的stack->bucketSize
值存储空间,值为字符串,因此类型为char*
。你没有这样做,实际上你正在有效地创建一个指向char*
的指针,并为它分配val
堆栈上的地址,该地址将在函数返回时消失。
struct NodeBucket需要知道它存储了多少项。
struct NodeBucket {
size_t numValues;
struct NodeBucket* next;
char** val;
};
此外,您还需要为val数组分配空间。像这样初始化:
struct NodeBucket* temp = malloc(sizeof *temp);
temp->val = malloc(sizeof(char*) * stack->bucketSize);
temp->numValues = 0;
temp->next = NULL;
以相反的顺序释放所有内容。
请注意,我将val
放在最后,因为您可以利用flexible array member feature将malloc(和释放)减少为一个。
然后,要添加新字符串,您会看到numValues
是否小于stack->bucketSize
。如果是,则将字符串添加到数组的末尾(stack->firstBucket->val[numValues] = val
)并增加numValues
。如果没有,则创建一个新的NodeBucket
并将其添加到那里。