我有一个结构体数组,其中每个数组元素为:
struct Item {
int code;
char * label;
};
数组本身是一个全局变量:
struct Item * ht[SIZE];
这是我当前如何在数组中插入项目的方法:
void insert(int toadd, char *toput) {
struct Item *item = (struct Item*) malloc(sizeof(struct Item));
item->label = toput;
item->code = toadd;
int hashIndex = 0;
//move in array until an empty or deleted cell
while(ht[hashIndex] != NULL && ht[hashIndex]->code != -1) {
//go to next cell
++hashIndex;
//wrap around the table
hashIndex %= SIZE;
}
ht[hashIndex] = item;
}
在另一个函数中,我调用insert方法,然后调用一些printf语句来检查正在发生的事情:
insert(ctr, trimwhitespace(line2));
printf("\nAdding to ht: String: %s Integer: %d\n", trimwhitespace(line2), ctr);
for (int i = 0; i < SIZE; i++) {
if (ht[i] != NULL)
printf("\nThis is what's inside ht: String: %s Integer: %d\n", ht[i] -> label, ht[i] -> code);
}
这是输出示例:
加到ht:字符串:4个整数:6
这是ht里面的内容:字符串:四位整数:0
这是ht里面的内容:字符串:4个整数:4
这是ht里面的内容:字符串:4个整数:5
这是ht里面的内容:字符串:4个整数:6
如您所见,该结构以不同的整数值多次插入。
我认为这与insert
调用所在的循环不太可能成为问题,因为如果多次进行insert
调用,则第一个打印语句也会被多次打印。但是我可能是错的。
如何确保insert
方法仅将结构插入一次而不是多次插入?
还是问题出在其他地方?
答案 0 :(得分:-1)
结果证明,在我的if
方法调用之前添加insert
语句,以检查是否早先已插入特定键,已解决了该问题,尽管这可能不是最理想的解决方法:
if (!containsKey(trimwhitespace(stringcopy3))) {
insert(ctr, trimwhitespace(stringcopy3));
printf("\nAdding to ht: String: %s Integer: %d\n", trimwhitespace(stringcopy3), ctr);
}
我仍然不确定为什么首先要插入多个键实例,但这是一个临时解决方案。