Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中创建递归数据结构的方法_C_Recursion_Struct_Typedef_Definition - Fatal编程技术网

在C语言中创建递归数据结构的方法

在C语言中创建递归数据结构的方法,c,recursion,struct,typedef,definition,C,Recursion,Struct,Typedef,Definition,假设我有一些hashmap可以引用自身,比如: typedef struct Person { char* name; Person* mother; Person* father; } Person; 解决错误的建议方法有哪些:未知类型名称“Person”错误?虽然没有定义typedef,但是struct标记是可以预先将其添加到struct的元素中的。例如: typedef struct Person { char* name; struct Pers

假设我有一些hashmap可以引用自身,比如:

typedef struct Person {
    char* name;
    Person* mother;
    Person* father;
} Person;

解决
错误的建议方法有哪些:未知类型名称“Person”
错误?

虽然没有定义
typedef
,但是
struct
标记是可以预先将其添加到
struct
的元素中的。例如:

typedef struct Person {
    char* name;
    struct Person* mother;
    struct Person* father;
} Person;
#包括
内部主(空){
//父母(忽略他们的父母)
Person*Kathy=malloc(sizeof(Person));
凯西->name=“凯西”;
人*Bill=malloc(sizeof(人));
票据->名称=“票据”;
//人
Person*Bob=malloc(sizeof(Person));
Bob->name=“Bob”;
鲍勃->母亲=凯西;
鲍勃->父亲=比尔;
printf(“姓名:%s |母亲:%s,父亲:%s\n”,鲍勃->姓名,鲍勃->母亲->姓名,鲍勃->父亲->姓名
免费的(鲍勃);免费的(凯西);免费的(比尔);
}
姓名:鲍勃|妈妈:凯西,爸爸:比尔


Person
尚未定义,因为typedef仅在结束它的分号之后生效。要从结构本身引用结构,请使用
struct Person
。以下代码在GCC 10.2.0上编译时没有错误

typedef结构人{
字符*名称;
结构人*母亲;
结构人*父亲;
}人;
int main(){
人凯西={“凯西”,空,空};
个人账单={“账单”,空,空};
Person Bob={“Bob”、&Kathy、&Bill};
返回0;
}

问题在于,结构定义中使用的人名作为数据成员母亲和父亲的类型说明符

typedef struct Person {
    char* name;
    Person* mother;
    Person* father;
} Person;
尚未宣布

在结构定义之前使用typedef,如

typedef struct Person Person;

struct Person{
    char* name;
    Person* mother;
    Person* father;
};
typedef struct Person {
    char* name;
    struct Person* mother;
    struct Person* father;
} Person;
或者在结构定义中使用声明的结构标记,如

typedef struct Person Person;

struct Person{
    char* name;
    Person* mother;
    Person* father;
};
typedef struct Person {
    char* name;
    struct Person* mother;
    struct Person* father;
} Person;

或者,在声明字段时,将
struct
放在字段前面,例如:
struct Person*mother;
struct Person*father;
@hgs3这两种方式中,您认为哪一种更常见?@David542这取决于个人偏好。事实上,许多项目,如Linux内核,都不
typedef
他们的结构。是一种形式优于另一种形式吗?或者这无关紧要,而且人们使用两种方式?@David542在某些.c文件中有指向结构的声明指针时,通常会使用第一种形式。在这种情况下,不需要结构的完整定义。因此,可以将typedef放在一个标题中,而将结构定义放在另一个标题中包含带有typedef的标题的其他标题。