我正在制作一个项目,并想知道我是否可以创建链表的链接列表。 我想在C中创建一个新类型 person ,其中每个 person 都可以拥有 kids 。 kids 是 person 的列表,而且每个人都有父母,他们也是 person 因为我正在考虑使用结构和链接列表来做这件事。
#include <stdio.h>
struct person {
unsigned int id; //identity,unique for every person
char* name;
struct person **father;
struct person **mother;
struct kids **kids;
}
struct kids {
struct person **kid;
struct kids **next_kid;
};
提前感谢您的时间。
答案 0 :(得分:3)
是的,你可以有列表列表,其中一个例子如下所示,每个孩子都有自己的玩具列表。
首先,两种类型的对象(儿童和玩具)的相关头文件和结构:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct sToy {
char name[50];
struct sToy *next;
} tToy;
typedef struct sChild {
char name[50];
tToy *firstToy;
struct sChild *next;
} tChild;
然后,用于分配内存的辅助函数,因此我不必通过大量错误检查来污染样本:
void *chkMalloc (size_t sz) {
void *mem = malloc (sz);
// Just fail immediately on error.
if (mem == NULL) {
printf ("Out of memory! Exiting.\n");
exit (1);
}
// Otherwise we know it worked.
return mem;
}
接下来,辅助函数分配两种类型的对象并将它们插入相关列表。请注意,我在列表的开头插入以简化代码,因此我们不必担心列表遍历或存储最终项目指针。
这意味着在倾销细节时,所有内容都会以相反的顺序打印,但为了保持简单而付出的代价很小:
void addChild (tChild **first, char *name) {
// Insert new item at start.
tChild *newest = chkMalloc (sizeof (*newest));
strcpy (newest->name, name);
newest->next = *first;
*first = newest;
}
void addToy (tChild *first, char *name) {
// Insert at start of list.
tToy *newest = chkMalloc (sizeof (*newest));
strcpy (newest->name, name);
newest->next = first->firstToy;
first->firstToy = newest;
}
接下来,以可读格式转储列表的功能:
void dumpDetails (tChild *currChild) {
// For every child.
while (currChild != NULL) {
printf ("%s has:\n", currChild->name);
// For every toy that child has.
tToy *currToy = currChild->firstToy;
if (currToy == NULL) {
printf (" <<nothing>>\n");
} else {
while (currToy != NULL) {
printf (" %s\n", currToy->name);
currToy = currToy->next;
}
}
currChild = currChild->next;
}
}
最后,将所有其他人捆绑在一起的主要功能是:
int main (void) {
tChild *firstChild = NULL;
addChild (&firstChild, "Anita");
addToy (firstChild, "skipping rope");
addChild (&firstChild, "Beth");
addChild (&firstChild, "Carla");
addToy (firstChild, "model car");
addToy (firstChild, "trampoline");
dumpDetails (firstChild);
return 0;
}
当您输入,编译并运行所有代码时,您可以看到它很容易处理列表列表:
Carla has:
trampoline
model car
Beth has:
<<nothing>>
Anita has:
skipping rope