簡體   English   中英

C程序-鏈接列表中的鏈接列表

[英]C program - linked list inside linked list

假設我想創建一本書的清單,這些書有一個或多個作者,以及書中的主要人物。 為此創建結構的最佳方法是什么? 以下內容是否准確或設置不同?

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

結構書 結構書*上一個;

};

我認為您的計划很好,使用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.
};

這使您的類型可轉換為node類型 然后,您可以根據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;
}

然后,您可以創建像這樣的書( 注意 :我將您的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);

為此創建結構的最佳方法是什么?

最好的方法取決於問題的細節,並且在某種程度上是見解。

以下內容是否准確或設置不同?

您介紹的兩個選擇看起來都很合理。

第一種選擇是將兩個名稱struct本身作為book struct成員,這在某些情況下可能會更加方便,因為它需要較少的動態分配。 另一方面,它使每個內部鏈接列表的第一個元素成為特殊情況,這可能會使您的代碼整體上更加復雜。

第二種選擇是,書struct包含指向兩個名稱struct s的指針,這使您更具一致性,並且更好地容納了一個或兩個內部列表為空的可能性。 考慮到所有事情,這就是我可能會考慮的事情。

在大多數情況下,您需要的數據結構是根據您擁有的數據類型以及您要對其執行的操作來決定的。

鏈表適合以下需求:

  1. 頻繁插入和刪除數據
  2. 數據量可能不適合一個地方/或無法立即使用。

它帶有以下問題:

  1. 搜索和檢索數據速度慢
  2. 在您的代碼中增加更多的復雜性和間接性。

據我所知,字符串的動態數組(char數組)足以滿足authors或者如果您擔心粒度問題,則可以使用指向struct name的指針數組,因為一本書可能有多位作者。

如果您想要靜態數組,可以為您做以下工作:

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

或者,如果您想變得更好,也可以使用動態數組。

鏈接列表也是一種替代方法,但是對於不需要頻繁插入刪除操作的小型數據項使用鏈接不是一個好主意,但是正如我指出的那樣,您知道應用程序需要根據交易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM