【问题标题】:How to delete structure entries in C如何删除C中的结构条目
【发布时间】:2009-12-03 09:45:12
【问题描述】:

我们如何从结构列表中删除其中的一些。删除结构后,不应留下任何空白空间。

尝试以下代码来完成任务,但没有成功。

   struct symtab *sp;
   for(sp = symtab; sp < &symtab[NSYMS]; sp++)
       if(sp->scope == scope) // delete
       {
           sp = sp+1;

       }

【问题讨论】:

  • 您确定要将数据放在表中而不是链表中吗?如果你想要快速删除,链表要快得多(free() + 一些指针引用)。使用表格,您需要在内存中移动内容。

标签: c struct


【解决方案1】:

你可以使用 memmove():

//pseudocode, not tested
struct symtab* end = &symtab[NSYMS];
for(sp = symtab; sp < end; sp++) {
    if(sp->scope == scope) {
        memmove( sp, sp + 1, (end - sp) * sizeof(struct symtab);
        sp++;
        end--;
    }
}            

请注意,end 可以更改,因为数组可能会变得“更短”。与该数组一起使用的其他代码只能访问缩短的区域。

【讨论】:

  • 这基本上是对的。虽然有一些小错误。修复这些之后,我就可以让它工作了。
  • 最好三重检查被移动的元素数量。像这样的一个小错误可能会在您最意想不到的时候导致分段错误。
【解决方案2】:

C 风格的数组 (*) 无法做到这一点。最好的是将其实现为链表,可以是单链或双链中的任意一种。

(*) 如果您必须使用数组,您可以从下一个元素执行 memmove 到您要删除的元素。但是,在这种情况下,您还必须更新 NSYMS 的值,这似乎是一个#define,不可能。

【讨论】:

    【解决方案3】:

    您可以向后遍历数组。但是,向前或向后,在必须移动的内存量方面,删除列表开头的元素会受到越来越大的惩罚。因此,首先删除数组末尾的条目可能会稍微优化性能。

    
    struct symtab *sp;
    struct symtab *endp; // end of array pointer
    
    endp = symtab + NSYMS; 
    for ( sp = symtab + NSYMS - 1; sp >= symtab; sp-- ) {
        if ( sp->scope = scope ) {
            int numelems = endp - (sp + 1);
            if ( numelems > 0 ) {
                memmove( sp, sp + 1, numelems );
                endp--; // adjust end of array pointer
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      有几个选项:

      • 继续使用固定大小的数组,但对关键字段使用标记值(例如 -1),这样您就知道哪些条目未使用。当您需要添加条目时,搜索下一个未使用的插槽。这仍然受到具有固定大小数组的限制。

      • 使用memmove,如其他答案中所述。这不是很有效。

      • 使用链表代替固定数组,然后您可以轻松(且廉价)删除和添加条目。

      基本上,除非您正在为某些具有严重内存限制的嵌入式系统编写代码,否则可能没有充分的理由对数组设置任意上限。其他结构(例如链表)可以轻松添加或删除,并且周围有大量库提供此类容器。

      毕竟,如果您正在管理符号表,您确定不想要哈希表(或字典)吗?

      【讨论】:

        【解决方案5】:

        最好的解决方案是使用包含结构的链表。如上所述,这对数组来说是非常低效的,因为如果最后没有删除数据,则必须移动数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-07
          • 2011-05-07
          • 2010-12-27
          • 1970-01-01
          • 1970-01-01
          • 2021-07-02
          • 1970-01-01
          相关资源
          最近更新 更多