使用带结构的联合

时间:2013-05-02 17:18:33

标签: c data-structures struct unions

我有这样的结构:

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'保持不变,因为它们位于不同的存储位置。
我希望在一个列表下的数据更改将反映在其他两个列表中。我相信'工会'可以帮助我做到这一点,但我不知道如何设置它。

任何帮助表示赞赏!

4 个答案:

答案 0 :(得分: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,并修复相邻元素中的所有指针。

答案 1 :(得分:0)

如果你希望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)并将其添加到另一个。

答案 2 :(得分:0)

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 :(得分:0)

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

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]的内容将反映链接到该缓冲区的所有结构的相同更改。然而,关键是你不能使用“共享”结构(例如union)来执行此操作,但必须在代码中对其进行管理。