2016-03-20 49 views
0

假設我想創建一個書籍列表,並且這些書籍有一個或多個作者,以及書中的主要角色。爲此創建結構的最佳方式是什麼?以下是準確的還是不同的設置?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

什麼是創造這種結構的最佳方式是什麼?

什麼是最好的取決於問題的細節,並在一定程度上見仁見智。

以下是準確的還是不同的設置?

你提出的兩種選擇看起來都合理。

第一個替代方案(struct本身也是struct的成員)可能在某些情況下由於需要較少的動態分配而變得更方便。另一方面,它使每個內部鏈表的第一個元素成爲一個特例,這可能會讓你的代碼更加複雜。

第二個替代方案,struct包含指向兩個名稱struct s的指針,可以提供更多一致性,並且更好地適應一個或兩個內部列表爲空的可能性。所有的事情都考慮到了,那就是我可能會選擇的那個。

0

您需要的數據結構大部分時間都是根據您擁有的數據類型以及您想要執行的操作來決定的。

鏈表是適用於下列需求:數據

    1. 頻繁的插入和刪除的數據量可能不適合在一個地方/或先進入可用。

    它配備了下列問題:

    1. 慢搜索和檢索數據
    2. 添加更多的複雜性和在方向到你的代碼。

    據我所看到的字符串(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。然後,您可以定義的node類型方面鏈表操作:

    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; 
        } 
    } 
    

    ,然後定義類型安全的操作書的書籍和名稱的列表中添加書籍:

    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; 
    } 
    

    然後你就可以像這樣(注意創建的書:I增加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

    馬丁,說我有各種分隔文件,包含書籍,作者和主要人物。您提供的答案是否適合從文件中讀取信息並創建列表。是否需要有種類的「外鍵」來關聯文件中的數據。 例如: ' 結構名稱 { node linked_list; char book_id_fk [20]; // < - 外鍵 char name_prefix [10]; // ...其他字段 }; struct book { node linked_list; int book_id [20]; // < - 主鍵 name * authors; name * main_characters; }; ' – devnuts

    +0

    該評論的格式化效果不佳。對不起 – devnuts