【问题标题】:Using unions with structures对结构使用联合
【发布时间】:2013-04-26 23:26:53
【问题描述】:

我有这样的结构:

struct data
{ 
    char abc[10];
    int cnt;
    struct data *next, *prior;
};
struct data *start, *last;
struct data *start1, *last1;
struct data *start2, *last2;

整数“cnt”可以有两个值。指针:

struct data *start, *last;

用于将所有数据与'cnt'的所有值联系起来。指针:

struct data *start1, *last1;
struct data *start2, *last2;

用于在'cnt'的值为1或2时链接数据。我的问题是当我为一个链表更改'abc'或'cnt'的值时,说'start->abc' ,值 'start1->abc' 和 'start2->abc' 不变,因为它们位于不同的内存位置。
我希望一个列表下的数据更改反映在其他两个列表中。我相信“工会”可以帮助我做到这一点,但我不知道如何设置它。

任何帮助表示赞赏!

【问题讨论】:

  • 将指针指向相同的内存位置。
  • 我曾想过这样做,但在这里纠结:
  • 起始列表有 20 个列表。 Start1 在它的列表中有 20 个中的 12 个,而 start2 有剩余的 8 个。我如何使用指向它的第 8 个列表(即开始列表中的第 17 个列表)的下一个指针遍历 start1 列表并进行更改以影响两个列表?

标签: c data-structures struct unions


【解决方案1】:

不,做不到。

即使您想出一个使用联合来完成此任务的解决方案,您实际上也会分配一些data 对象,这些对象的分配方式使它们在内存中相互重叠。你最终会得到一个连续的内存块。

与其完全不考虑链表,而是使用数组:

struct data {
    char abc[10];
    int data;
}

struct data datas[50];
struct data* some = datas[20];
struct data* prev = some - 1;
struct data* next = some + 1;

(不要越界。)


如果出于某种原因你真的想要一个链表,那么它们的重点是每个元素都可以在内存中的任何位置。这意味着每个元素都需要记住下一个和上一个的地址,以便进行双向导航。

因此,与其考虑联合技巧,不如创建一个函数 insertDataremoveData 对列表执行基本操作并修复相邻元素中的所有指针。

【讨论】:

    【解决方案2】:
    char global_abc[10];
    int global_cnt;
    
    struct data
    { 
        char *abc;
        int *cnt;
        struct data *next, *prior;
    };
    
    start->abc = start1->abc = start2->abc = global_abc;
    start->cnt = start1->cnt = start2->cnt = aglobal_cnt;
    

    现在当你改变了

    strcpy(start->abc, "any");
    

    那么它将为其他元素更改。

    当你改变了

    *(start->cnt) = 5;
    

    那么它将为其他元素更改。

    【讨论】:

      【解决方案3】:

      如果您希望data 同时存在于两个列表中,即“all”列表和“cnt”列表,那么您需要在结构中使用两组start, last 指针。

      struct data
      { 
          char abc[10];
          int cnt;
          struct data *next_all, *prior_all;
          struct data *next_cnt, *prior_cnt;
      };
      

      当你更改cnt的值时,你必须从next_cnt, prior_cnt列表中移除数据(对应start1, last1start2, last2)并添加到另一个。

      【讨论】:

        【解决方案4】:

        使用一组数组来保存数据,并使用结构中指向这些数组的指针。然后“链接”条目可以指向相同的数据缓冲区...

        struct data
        { 
            char* abc;
            int cnt;
            struct data *next, *prior;
        };
        struct data *start, *last;
        struct data *start1, *last1;
        struct data *start2, *last2;
        
        char abcBuffer[2][10];
        

        在某处的某些功能中......

        start->abc = abcBuffer[start->cnt];
        start1->abc = abcBuffer[start1->cnt];
        start2->abc = abcBuffer[start2->cnt];
        

        在这种情况下,更改abcBuffer[n] 的内容将反映链接到该缓冲区的所有结构的相同更改。但是,关键是您不能使用联合等“共享”结构来执行此操作,而必须在代码中对其进行管理。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-08
          • 1970-01-01
          • 2019-06-05
          相关资源
          最近更新 更多