2012-03-27 112 views
0

我具有这样的结构:从结构的数组中删除; S

typedef struct score_entry 
{ 
    char name[21]; 
    int score; 
} score_entry; 

和阵列: score_entry readin[1000];

欲写消耗score_entry arrayname(String)的功能,并删除所有结构在具有该名称的数组中并返回新数组。这可能吗?如果是这样怎么办?

+0

你有哪一部分的问题? – TJD 2012-03-27 19:06:26

+0

如果您使用的是静态数组,则无法从中删除项目。使用链接列表,而不是 – 2012-03-27 19:08:35

回答

0

我可能只是使用链表,然后删除有问题的元素。否则,你必须迭代你的数组,并跳过/移动不匹配你的搜索字符串/名称的条目。

0

数组元素创建后无法删除。而不是

score_entry readin[1000]; 

请考虑创建链接列表。首先添加一个新的元素结构

typedef struct score_entry 
{ 
    char name[21]; 
    int score; 
    struct score_entry *next; 
} 

再考虑任何example of creating singly linked lists,然后进行新功能的实现,其中,你可以轻松地删除匹配标准的哪些节点

2

那么你不能“删除“的元素。但是你可以计算不匹配的元素名称,在堆上创建一个新数组,然后复制所有感兴趣的元素。基本代码可能如下所示,但是,您应该使其安全,不要对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; 

    } 
+0

,但我不喜欢编辑数组? ....说我想要'readin = sortout(readin,“somestring”)'...将readin是新阵列还是不是? – Thatdude1 2012-03-27 19:36:51

+0

请注意,这种方法是昂贵的,内存和CPU方面。上面列出的链接列表可能更好,尽管这对于原始问题更为真实。 – 2012-03-27 19:36:57

+0

@Beginnernato:不,你不能。但是,如果堆上的第一个数组,则可以在此过程之后将其释放。但是,将数组的所有元素排序开始并执行'realloc'可能会更好。 @Randall Cook:你说得对。我试图回答这个问题,但是,我绝不会推荐这种方法。 – Matthias 2012-03-27 19:42:02

0

如何跟踪数组中元素的数量?虽然你不能删除元素;你可以压碎出来,然后再递减计数,例如:

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; 
} 
+0

你的代码究竟在做什么^? – Thatdude1 2012-03-27 20:30:59

+0

想想两个人,他们从数组的底部开始,但速度更快的人跑过了您想要删除的所有元素;然后把所有你想要的元素抛到慢慢的家伙身上,当你完成后,你有一个好的元素清单,然后是垃圾。然后,'* nelem = lo'“返回”“新”列表中元素的数量。 – Dave 2012-03-27 20:37:23

+0

所以它返回的好元素有点的所有迹象? – Thatdude1 2012-03-27 20:42:29