Как я могу определить две структуры, каждая из которых используется во второй?Язык C - PullRequest
0 голосов
/ 05 апреля 2019

Могу ли я определить две структуры и использовать каждую в другой? мой код ниже.

Я пытаюсь использовать typedef, но не работает.

struct Book{
int isbn;
char title[21];
//This is Auther struct usage;
struct Auther bauther[21];
int numofauth;
char section[21];
int copies;
};

struct Auther{
char auth_name[21];
//This is Book struct usage;
struct Book auth_books[21];
};

J: \ Collage_Library \ main.c | 23 | ошибка: переопределение 'struct Auther' |

Ответы [ 2 ]

4 голосов
/ 05 апреля 2019

A struct не может быть внутри другого struct, который находится внутри первого struct, по той же причине, что в реальном мире вы не можете поместить объект внутри другого объекта внутри первого объекта.

Объект может ссылаться на другой объект с помощью указателя.

Например, struct Book может иметь член, который является указателем на struct Author или массивом указателей на struct Author.Это может быть объявлено так:

struct Book
{
    int isbn;
    char title[21];
    struct Author *bauthor[21]; // Array of pointers to struct Author.
    int numofauth;
    char section[21];
    int copies;
};

Аналогично, struct Author может содержать указатели на struct Book:

struct Author
{
    char auth_name[21];
    struct Book *auth_books[21]; // Array of pointers to struct Book.
};

При создании объектов struct Book или struct AuthorВам нужно будет заполнить указатели.Для этого вам нужно будет создать каждую из структур, а затем назначить значения указателям.Например:

struct Book *b = malloc(sizeof *b);
if (b == NULL) ReportErrorAndExit();
struct Author *a = malloc(sizeof *a);
if (a == NULL) ReportErrorAndExit();

b->isbn = 1234;
strcpy(b->title, "Forward Declarations");
b->bauthor[0] = a; // List a as one of b's authors.
b->numofauth = 1;
strcpy(b->section, "Structures");
b->copies = 1;

strcpy(a->auth_name, "C committee");
a->auth_books[0] = b; // List b as one of a's books.
1 голос
/ 05 апреля 2019

Вот простой пример со ссылками один на один.

#include  <stdio.h>

struct Book {
    char title[21];
    struct Auth *auth;
};

struct Auth {
    char name[21];
    struct Book *book;
};


int main(void)
{  
    struct Auth a = { "People of God" , NULL };
    struct Book b = { "42-line Bible", &a };
    a.book = &b;

    printf("book title:  %s\r\n", b.title);
    printf("book author: %s\r\n", b.auth->name);

    printf("auth name:   %s\r\n", a.name);
    printf("auth book:   %s\r\n", a.book->title);

    return 0;
}
...