【问题标题】:Access data stored in struct within Doubly Linked List?访问存储在双向链表中的结构中的数据?
【发布时间】:2014-07-10 20:05:02
【问题描述】:

我不确定我必须具体到什么程度,但我会尽我所能提供详细信息。我正在使用 typedef 结构:

typedef struct {
  char name[21];
  int  life;
} pcb_t;

输入姓名和生活的值,然后将其存储在双向链表中。

头文件中的链表结构是:

typedef struct list_node {
  void             *data;
  struct list_node *next;
  struct list_node *prev;
} List_node_t;

typedef struct {
  List_node_t *head;
  List_node_t *tail;
} List_t;

在我的 main 中,我将第一个结构变量初始化为:

  char   name[BUF_MAX];
  int    life;
  pcb_t  *pcb;

输入全部正确,pcb 结构作为新节点存储在列表中。我尝试在初始输入之后运行一个简单的循环,以打印出每个 pcb 结构的名称和寿命值。我使用的循环是这样的:

void *context = NULL;
void *data;
while( List_next_node( &the_list, &context, &data) && (data != NULL))
  {

     printf("Name: %s\n", (char *)data);
     printf("Lifetime: %d\n", (int )data); 
   }

List_next_node 函数横穿列表的位置。 the_list 是列表,上下文是跟踪我们在列表中的位置,数据是数据。

我不确定如何访问我想要的信息,因为我的 while 循环正确打印出 pcb 结构的名称,但生命周期不是。

【问题讨论】:

    标签: c struct


    【解决方案1】:

    printf("Lifetime: %d\n", ( (pcb_t *) data) ->life);

    【讨论】:

    • ;当我这样做时,我得到两个错误:“'pcb_t'之前的预期表达式”和'data'之前的“expected ')'”
    • 应该是((pcb_t *) data)->life
    【解决方案2】:

    列表,无论是双向链接还是其他方式,都是一个完整的红鲱鱼,在这里。问题是(1)访问struct 成员,希望这是微不足道的; (2) 当你只有void * 时这样做,这可能不太直观。

    这是最简单的方法:

    void *data;
    while( List_next_node( &the_list, &context, &data) && (data != NULL))
    {
        pcb_t * current_data = data;
        printf("Name: %s\n", current_data->name);
        printf("Lifetime: %d\n", current_data->life); 
    }
    

    当前代码“有效”打印名称的唯一原因是因为namestruct 的第一个元素,因此name 的地址恰好与整个struct,因此当您将struct 的地址转换为char * 时,您会得到您期望的结果,即使您并没有真正以正确的方式到达那里。

    正如 ojblass 的回答所示,您可以通过强制转换来避免使用临时变量,但我认为临时变量可以让事情变得更清晰。

    【讨论】:

    • 在我将data 更改为current_data 之前,您可能已经发现了它。当前答案中不需要强制转换。
    • 感谢您的洞察力。我知道打印名称实际上并不是正确的处理方式,但在我研究第二个元素时就离开了。我尝试了类似于 ojblass 解决方案的方法,并在我的尝试没有奏效时决定来到这里 - 甚至没有考虑临时变量。我对 C 比较陌生,还没有得到指示。干杯
    • 别担心,如果你继续努力,你最终会得到它。有些东西可能需要一段时间才能融入其中,但一旦融入其中,你对正在发生的事情的心理模型就会开始与实际发生的事情相匹配,而混乱就会消失。一旦你设法克服了对他们真正在做什么没有信心的绊脚石,指针实际上非常简单。
    猜你喜欢
    • 2015-06-26
    • 1970-01-01
    • 2015-01-05
    • 2019-05-02
    • 1970-01-01
    • 2017-08-14
    • 2015-12-27
    • 1970-01-01
    相关资源
    最近更新 更多