2016-03-20 2 views
0

私は書籍のリストを作成したいと思います。その書籍には、1人または複数の著者と本の主人公があります。このための構造を作成する最良の方法は何ですか?以下は正確か、別の設定か?リンクリスト内のCプログラムリンクリスト

struct name 
{ 
char prefix[5]; 
char first[50]; 
char middle[50]; 
char last[50]; 
char suffix[5]; 
struct name *next; /* linked list */ 
struct name *previous; /* linked list */ 
}; 


struct book 
{ 
struct name authors; 
struct name main_characters; 
char title[100]; 
char publisher[100]; 

struct book * next; struct book * previous;

}; 
+1

'authors'と' main_characters'はリストの頭ですか?彼らは指針でなければなりません。 –

答えて

1

このための構造体を作成するための最良の方法は何ですか? 最高

問題の詳細に依存し、ある程度意見の問題です。

以下は正確か、別の設定ですか?

あなたが提示した2つの選択肢はどちらも妥当です。

structという名前の2つの名前自体が書籍structのメンバーである最初の選択肢は、動的割り当ての必要性がより低いため、状況によってはさらに便利な場合があります。一方で、内部リンクされたリストの最初の要素は特殊なケースになり、全体的にコードが複雑になる可能性があります。

structの本のstructに2つの名前structのポインタが含まれているもう1つの方法は、一貫性が向上し、どちらかまたは両方の内部リストが空である可能性が高くなります。すべてのことが考慮され、それは私がおそらく行くだろう。

0

必要なデータ構造は、使用しているデータの種類と実行したい操作に基づいて決定されます。

リンクされたリストは、次のニーズに適しています。データ

    1. 頻繁に挿入や削除は、データの量は、一つの場所に収まる/または最初に行くでは使用できない場合があります。

    それは、次の問題が付属しています。より多くの複雑さとで方向あなたのコードに追加

  • データを検索し、取得するためにスロー

    1. 。私の知る限り、文字列の動的配列(char配列)がauthorsで十分でしょうか本を持っているかもしれないので粒度はあなたが心配している何かであれば、あなたのstruct nameへのポインタの配列を使用することができます見ることができるよう

    複数の著者。

    あなたは、静的な配列は、以下の場合、あなたのためにそれを行うことができます。

    #define MAX_AUTHOR_LIMIT 10 
    struct boook { 
        ... 
        struct name *authors[MAX_AUTHOR_LIMIT]; 
        int author_count; 
        ... 
    } 
    

    それとも、より良いようにしたい場合、あなたにも動的配列を使用することができます。

    リンクリストもありますが、頻繁な挿入削除を必要としない小さなデータセットのリンクを使用するのは良いアイデアではありませんが、もう一度アプリケーションが決定する必要があることを指摘しましたトレードオフに基づいている。

  • 2

    あなたの計画はauthorsmain_charactersのポインタを使って問題ないと思います。書籍や作者、主人公のための介入リンクリストを使用しているときに、リンクリストの構造と操作を除外すると便利です。あなたはこのような構造を宣言した場合

    struct node 
    { 
        struct node *next; 
        struct node *previous; 
    }; 
    typedef struct node node; 
    

    を最初の要素として、あなたの種類のそれぞれにそれを埋め込むことができます。

    struct name 
    { 
        node linked_list; 
        char name_prefix[10]; 
        char name_first[50]; 
        char name_middle[50]; 
        char name_last[50]; 
        char name_suffix[5]; 
    }; 
    
    struct book 
    { 
        node linked_list; 
        name *authors; 
        name *main_characters; 
    
        /* variables for book */ 
        char title[100]; /* the title of the book */ 
        char publisher[100]; /* publisher */ 
        //etc. 
    }; 
    

    これはあなたのタイプconvertible to the node typeになります。

    void 
    node_add_node(node **head, node *object) 
    { 
        if (*head == NULL) { 
         *head = object; 
        } 
        else { 
         node *current, *previous; 
         for (current = *head; current != NULL; current = current->next) { 
          previous = current; 
         } 
         previous->next = object; 
        } 
    } 
    
    そしてブックに書籍や名前のリストに本を追加するには、タイプセーフな操作を定義します:あなたは、その後 nodeタイプの観点からリンクリストの操作を定義することができます

    void 
    books_add_book(struct book **books, struct book *book) 
    { 
        node_add_node((node**)books, (node*)book); 
    } 
    
    void 
    book_add_author(struct book *book, struct name *author) 
    { 
        node_add_node((node**)&book->authors, (node*)author); 
    } 
    
    void 
    book_add_main_character(struct book *book, struct name *character) 
    { 
        node_add_node((node**)&book->main_characters, (node*)character); 
    } 
    

    その後、コンストラクタを実装:

    void node_init(node *node) 
    { 
        node->previous = NULL; 
        node->next = NULL; 
    } 
    
    struct book * 
    book_create(const char *title, const char *publisher) 
    { 
        struct book *b = malloc(sizeof(book)); 
        if (b) { 
         node_init(&b->linked_list); 
         b->authors = NULL; 
         b->main_characters = NULL; 
         strcpy(b->title, title); 
         strcpy(b->publisher, publisher); 
        } 
        return b; 
    } 
    
    struct name * 
    name_create(const char *prefix, const char *first, const char *middle, 
        const char *last, const char *suffix) 
    { 
        name *n = malloc(sizeof(name)); 
        if (n) { 
         node_init(&n->linked_list); 
         strcpy(n->name_prefix, prefix); 
         strcpy(n->name_first, first); 
         strcpy(n->name_middle, middle); 
         strcpy(n->name_last, last); 
         strcpy(n->name_suffix, suffix); 
        } 
        return n; 
    } 
    

    そしてあなたは、このような図書(NOTE作成することができます。私は、yのサイズを増加します私たちのname_prefixから10):

    struct book *books = NULL; 
    struct book *b = book_create("War and Peace", "Wordsworth"); 
    struct name *n = name_create("Count", "Lev", "Nikolayevich", "Tolstoy", ""); 
    book_add_author(b, n); 
    n = name_create("Count", "Pyotr", "Kirillovich", "Bezukhov", ""); 
    book_add_main_character(b, n); 
    n = name_create("Countess", "Natalya", "Ilyinichna", "Rostova", ""); 
    book_add_main_character(b, n); 
    books_add_book(&books, b); 
    
    +0

    非常に参考になりました、ありがとうございます。 – devnuts

    +0

    Martin、書籍、作者、主人公を含むさまざまな区切りファイルがあります。あなたが提供した答えは、ファイルから情報を読み込んでリストを作成するのに適していますか?ファイル内のデータを関連付けるために、「外部キー」が必要ですか? 例: ' 構造体名 { ノードlinked_list; char book_id_fk [20]; // < - 外部キー char name_prefix [10]; // ...他のフィールド }; struct book { node linked_list; int book_id [20]; // < - プライマリキー name * authors; 名前* main_characters; }; ' – devnuts

    +0

    そのコメントの書式設定はうまくいかなかった。申し訳ありません – devnuts

    関連する問題