访问存储在双链表中的struct中的数据?

时间:2014-05-21 23:59:36

标签: c struct

我不确定我有多具体,但我会尽可能地给出细分。我采用了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;

在我的主要内容中,我将第一个结构变量初始化为:

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

输入全部正确,pcb结构作为新节点存储在列表中。我尝试在初始输入后运行一个简单的循环来打印出Name&每个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是列表,context是跟踪我们在列表中的位置,而data是数据。

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

2 个答案:

答案 0 :(得分:1)

列表,双重链接或其他方式,是完整的红鲱鱼,在这里。问题是(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的回答所示,您可以使用强制转换来避免使用临时变量,但我认为临时变量可以使事情变得更加清晰。

答案 1 :(得分:0)

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