我不确定我有多具体,但我会尽可能地给出细分。我采用了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结构的名称,但生命周期不是。
答案 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);
}
当前代码“用于”打印名称的唯一原因是因为name
是struct
的第一个元素,因此name
的地址恰好是与整个struct
的地址相同,因此当您将struct
的地址转换为char *
时,您会得到您期望的结果,即使您没有真正到达那里正确的方式。
正如ojblass的回答所示,您可以使用强制转换来避免使用临时变量,但我认为临时变量可以使事情变得更加清晰。
答案 1 :(得分:0)
printf(“Lifetime:%d \ n”,((pcb_t *)data) - > life);