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个列表,并对这两个列表进行更改?