我具有这样的结构:从结构的数组中删除; S
typedef struct score_entry
{
char name[21];
int score;
} score_entry;
和阵列: score_entry readin[1000];
欲写消耗score_entry array
和name(String)
的功能,并删除所有结构在具有该名称的数组中并返回新数组。这可能吗?如果是这样怎么办?
我具有这样的结构:从结构的数组中删除; S
typedef struct score_entry
{
char name[21];
int score;
} score_entry;
和阵列: score_entry readin[1000];
欲写消耗score_entry array
和name(String)
的功能,并删除所有结构在具有该名称的数组中并返回新数组。这可能吗?如果是这样怎么办?
我可能只是使用链表,然后删除有问题的元素。否则,你必须迭代你的数组,并跳过/移动不匹配你的搜索字符串/名称的条目。
数组元素创建后无法删除。而不是
score_entry readin[1000];
请考虑创建链接列表。首先添加一个新的元素结构
typedef struct score_entry
{
char name[21];
int score;
struct score_entry *next;
}
再考虑任何example of creating singly linked lists,然后进行新功能的实现,其中,你可以轻松地删除匹配标准的哪些节点
那么你不能“删除“的元素。但是你可以计算不匹配的元素名称,在堆上创建一个新数组,然后复制所有感兴趣的元素。基本代码可能如下所示,但是,您应该使其安全,不要对struct标记和typename使用相同的标识符,并返回新数组的大小。
score_entry *sortout(score_entry *array, char* string) {
score_entry *newarray;
int i, n=0;
/* measure the size of the filtered array copy */
for(i=0; i<1000; i++) {
if (strcmp(array[i].name, string) n++;
}
/* allocate space for the filtered copy */
newarray = (score_entry*)calloc(n, sizeof(score_entry));
/* filter and copy the data */
for(i=0, n=0 ; i<1000; i++) {
if (strcmp(array[i].name, string))
newarray[n++] = array[i];
}
return newarray;
}
,但我不喜欢编辑数组? ....说我想要'readin = sortout(readin,“somestring”)'...将readin是新阵列还是不是? – Thatdude1 2012-03-27 19:36:51
请注意,这种方法是昂贵的,内存和CPU方面。上面列出的链接列表可能更好,尽管这对于原始问题更为真实。 – 2012-03-27 19:36:57
@Beginnernato:不,你不能。但是,如果堆上的第一个数组,则可以在此过程之后将其释放。但是,将数组的所有元素排序开始并执行'realloc'可能会更好。 @Randall Cook:你说得对。我试图回答这个问题,但是,我绝不会推荐这种方法。 – Matthias 2012-03-27 19:42:02
如何跟踪数组中元素的数量?虽然你不能删除元素;你可以压碎出来,然后再递减计数,例如:
void
delete(score arr[], int *nelem, score target){
int hi, lo, count;
for(hi=lo=0; hi<*nelem; hi++){
arr[lo] = arr[hi];
if(!same(target, arr[lo]))
lo++;
}
*nelem = lo;
}
你有哪一部分的问题? – TJD 2012-03-27 19:06:26
如果您使用的是静态数组,则无法从中删除项目。使用链接列表,而不是 – 2012-03-27 19:08:35