【问题标题】:Passing Structures by Reference? [C]通过引用传递结构? [C]
【发布时间】:2011-02-02 02:18:19
【问题描述】:
我正在尝试创建一个链表,在一个结构中包含两个单独的列表。也就是说,它包含一个“名称”和一个“年龄”值。然后程序可以输出按名称排序或按年龄排序的列表。所以我基本上需要两个链表。
但是,我需要程序知道姓名列表和年龄列表的根/头。
我不确定如何将其发送到我的函数。
我已经有了想要添加到每个列表的姓名和年龄,然后我必须以某种方式将其发送到每个列表的头部。因为我要返回两个头,所以我不能使用返回功能。如何让我的主要成员了解对头/根列表的更改?
希望问题很清楚,感谢您的回答!
【问题讨论】:
标签:
c
linked-list
pass-by-reference
structure
【解决方案1】:
您可以将单个列表项链接到两个列表中并独立排序:
/* List item is linked into two lists */
struct list
{
struct list* name_next; /* next in name list */
struct list* age_next; /* next in age list */
char* name;
unsigned age;
};
/* Holds both list heads */
struct book
{
struct list* name_sorted;
struct list* age_sorted;
};
【解决方案2】:
您可以将指针用作鱼王国suggested。我只是想补充一点,您的文档应该指出这些值是“输出”,即使它们是参数。
-
您可以使用元组数据类型。这是一个简单的:
typedef struct Tuple{void*a,*b;}*Tuple;
Tuple tuple(void*a,void*b){
Tuple z=malloc(sizeof(struct Tuple));
z->a=a,z->b=b;
return z;
}
但请注意,跟踪动态分配内存可能很困难,除非您使用 garbage collector,否则您需要非常小心。
-
您可以使用不太通用的数据结构。例如,您可以通过 person-object 线程化索引:
struct Person;typedef struct Person*Person;
struct Person{Person*prev_by_name,*next_by_name,*prev_by_age,*next_by_age; ...};
添加额外的索引(链表)变得微不足道,如果您仔细考虑一下,您可以让预处理器为您完成大部分工作。
此方法还使您能够询问“戴夫之后谁是第二年轻的人”
最后,通过这种方式对索引进行线程化,一个人的索引的所有更新都将保存在一起,这将更容易避免同步错误。
您可以使用单独的函数并简单地“记住”来调用它们。如果这是用于家庭作业,并且您尚未解决如何返回多个值,那么您可能希望选择此“解决方案”,因为它可能是您的老师正在寻找的。p>
【解决方案4】:
您可以简单地将指向两个头的指针作为参数传递,然后毫无问题地更改指针。
void list_add(char *name, int age, list_type *list, list_type **name_head, list_type **age_head)
{
/* Add the name and age and calculate the two heads. */
(*name_head) = calculated_head;
(*age_head) = calculated_head;
}