我有一个结构数组,它们按ID排序,并且在数组中有该ID的重复条目。数组中的每个结构都有许多与之关联的点,我想找到每个ID的总点数。我想删除所有重复项并将它们的总点值存储在单个结构中,以减小数组的大小。
typedef struct boat_data {
int ID;
int time_to_complete_race; //This can be ignored
int points;
} boat_node;
typedef boat_node boat_ptr;
我编写的当前代码似乎无法按预期工作。tot_boats是船tot_members的数量,是已找到的成员的数量(我的意思是,当前存在非重复ID的数量)。我有两个数组结构,其中的final_boat_scores大小为存在的成员数的大小,我想存储该ID值和该points值
for(int boat = 0; boat < (total_boats - tot_members); boat++) {
for (int next_boat = 0; next_boat < (total_boats - tot_members); next_boat++) {
if (boat_scores[boat].ID == boat_scores[next_boat].ID) {
final_boat_scores[boat].ID = boat_scores[next_boat].ID;
final_boat_scores[boat].points += boat_scores[next_boat].points;
break;
}
}
}
请让我知道您是否可以更改数组输入。如果是,您是否每次需要将新元素存储到数组时都只检查ID?如果ID与已存储的元素匹配,只需让recordedPoint + =点(即,将要存储的点直接添加到数组中记录的总点中)即可。这样,您将不会创建重复的条目。
编辑:由于您无法更改输入数组,因此可以遍历boat_score数组和final_boat_score数组,并检查当前船的ID是否已记录到final_boat_score数组中。如果是,则只需将其添加到总分中即可。我认为您的代码存在的问题是您没有遍历数组中的所有元素,因为数组大小绝对不是total_boats - tot_members。您也不需要该final_boat_scores[boat].ID = boat_scores[next_boat].ID;行,因为它是多余的,您的if语句仅在确实如此的情况下才执行。您的break;语句也会过早地结束循环,在这种情况下,您不能及早退出循环,因为您实际上并不知道您有多少个具有相同ID的条目,对吗?
//remember to initialize final_boat_score first with all IDs you have
for (int i = 0; i < final_boat_score_size; i++) {
//initialize the total point = 0 first
final_boat_score[i].points = 0;
//then loop through your input data
for (int j = 0; j < boat_score_size; i++) {
//if there exist an input element boat_score[j] with the same ID
//as the current final_boat_score[i] element, add its points to the total
if (final_boat_score[i].ID == boat_score[j].ID) {
final_boat_score[i].points += boat_score[j].points;
}
}
}
但是,这不会删除原始数组,因此,如果您不再需要它,则需要自己删除它。希望对您有所帮助!
#https://stackoverflow.com/questions/59091226/how-do-i-remove-duplicate-values-in-an-array-of-structs-c
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。