C 对结构使用联合

C 对结构使用联合,c,data-structures,struct,unions,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; struct data *start1, *last1

我有一个这样的结构:

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;
struct data *start1, *last1;
struct data *start2, *last2;
用于将所有数据与“cnt”的所有值链接。指针:

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

感谢您的帮助

不,不行

即使您提出了一个使用联合来完成此任务的解决方案,您基本上也会有一些
数据
对象以这样的方式分配,它们在内存中相互重叠。最终会得到一个连续的内存块

与此相反,完全忽略链接列表并使用数组:

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;
(不要越界。)


如果出于某种原因确实需要一个链表,那么链表的全部要点就是每个元素都可以位于内存中的任何位置。这意味着每个元素都需要记住下一个和上一个元素的地址,以便实现双向导航

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

不,无法完成

即使您提出了一个使用联合来完成此任务的解决方案,您基本上也会有一些
数据
对象以这样的方式分配,它们在内存中相互重叠。最终会得到一个连续的内存块

与此相反,完全忽略链接列表并使用数组:

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;
(不要越界。)


如果出于某种原因确实需要一个链表,那么链表的全部要点就是每个元素都可以位于内存中的任何位置。这意味着每个元素都需要记住下一个和上一个元素的地址,以便实现双向导航


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

如果希望
数据同时存在于两个列表中,“all”列表和“cnt”列表,然后在结构中需要两组
start,last
指针

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

更改
cnt
的值时,必须从
下一个cnt、上一个cnt
列表(对应于
start1、last1
start2、last2
)中删除数据并将其添加到另一个列表中。

如果希望
数据同时存在于两个列表中,“全部”列表和“cnt”列表,然后在结构中需要两组
start,last
指针

struct data
{ 
    char abc[10];
    int cnt;
    struct data *next_all, *prior_all;
    struct data *next_cnt, *prior_cnt;
};
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;
更改
cnt
的值时,必须从
next\u cnt,previor\u cnt
列表(对应于
start1,last1
start2,last2
)中删除数据并将其添加到另一个列表中

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;
然后,它将被更改为其他元素

当你换了衣服的时候

strcpy(start->abc, "any");
*(start->cnt) = 5;
然后,它将被更改为其他元素

现在当你改变了

strcpy(start->abc, "any");
*(start->cnt) = 5;
然后,它将被更改为其他元素

当你换了衣服的时候

strcpy(start->abc, "any");
*(start->cnt) = 5;

然后,它将被更改为其他元素。

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

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)来实现这一点,而必须在代码中对其进行管理。

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

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)来实现这一点,而必须在代码中对其进行管理。

将指针指向同一内存位置。我曾想过这样做,但在这里遇到了麻烦:开始列表有20个列表。Start1在其列表中有20个中的12个,start2有其余8个。如何用下一个指针遍历start1列表,指向它的第8个列表,即开始列表中的第17个列表,并对这两个列表进行更改?将指针指向同一个内存位置。我曾想过这样做,但在这里遇到了麻烦:开始列表有20个列表。Start1在其列表中有20个中的12个,start2有其余8个。如何遍历start1列表,使下一个指针指向它的第8个列表,即开始列表中的第17个列表,并对这两个列表进行更改?