我有这样的结构:
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'保持不变,因为它们位于不同的存储位置。
我希望在一个列表下的数据更改将反映在其他两个列表中。我相信'工会'可以帮助我做到这一点,但我不知道如何设置它。
任何帮助表示赞赏!
答案 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;
(不要走出界限。)
如果由于某种原因确实需要链表,那么它们的重点在于每个元素都可以在内存中的任何位置。这意味着每个元素都需要记住下一个和前一个的地址,以便允许双向导航。
因此,不要考虑联合技巧,只需创建一个在列表上执行基本操作的函数insertData
或removeData
,并修复相邻元素中的所有指针。
答案 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, last1
或start2, 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)来执行此操作,但必须在代码中对其进行管理。