我正在为一个学校项目使用 C a Zoo 进行编码。其中有区域和动物的地方。我们必须使用动态结构。我正在尝试做这些领域,但我被困住了。我正在使用链接列表。
结构
typedef struct area Area, *pArea;
struct area{
char id[10];
int size, nadj;
pArea prox; //for linked list
pArea adj[3]; ///array of pointers to the struct area
};
填写列表
void fill(pArea p){
printf("ID: ");
scanf(" %10[^\n]", p->id);
printf("Size: ");
scanf(" %d", &p->size);
printf("Nadj: ");
scanf(" %d", &p->nadj);
if(p->nadj == 0)
for(int i = 0; i < p->nadj; i++)
p->adj[i] = NULL;
else
//stuck here. HELP
}
p->prox = NULL;
}
AreaA 500 2 AreaB AreaC
其中,AreaA 是 id,500 是大小变量,2> 是区域 A 附近的区域 (nadj) 数量,后面是区域。现在,我的老师说,id Area附近的区域必须存储在指向struct Area的指针数组中(pArea adj[3],它必须在max 3 Areas),但我不知道如何填充该数组,而只使用区域的名称,就像上面的示例中的那样,当它们的类型为 struct Area 而不是数组时。
最佳答案
您需要维护某种从区域名称到区域的 map 。然后
for (int i = 0; i < p->nadj; i++) {
name = read_name();
p->adj[i] = find_area_by_name(name);
}
其中find_area_by_name
,嗯,应该做它的名字所暗示的事情。根据您需要处理的区域数量(以及类的级别),您可以像线性查找一样简单地实现它,也可以像 AVL 树一样奇特地实现它。
顺便说一句,
if(p->nadj == 0)
for(int i = 0; i < p->nadj; i++)
p->adj[i] = NULL;
实际上是一个空操作。由于只有当p-nadj == 0
时才进入循环,所以等价于
for(int i = 0; i < 0; i++)
关于c - 指向结构体的指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43562702/