1

我有这样的结构:

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

4 回答 4

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对列表执行基本操作,并修复相邻元素中的所有指针。

于 2013-05-02T17:23:30.463 回答
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;

然后它将针对其他元素进行更改。

于 2013-05-02T17:27:53.227 回答
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)并将其添加到另一个。

于 2013-05-02T17:24:52.253 回答
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]将反映链接到该缓冲区的所有结构的相同更改。然而,关键是您不能使用“共享”结构(例如联合)来执行此操作,而必须在代码中对其进行管理。

于 2013-05-02T17:32:46.460 回答