簡體   English   中英

具有動態節點大小的C鏈表

[英]C Linked List with dynamic node size

我試圖在C中創建一個鏈表,其中每個節點在程序啟動時都有用戶輸入的特定大小。 我已經想到了一個結構:

struct ListNode{

    char * str;

    struct ListNode * next_node;

};

但是這里每個節點的大小是固定的。 有任何想法嗎?

非常感謝。

似乎您需要節點每次更改的數據大小。 您可以通過使用一個固定大小的節點來實現此目的,該節點擁有一個指向動態分配的數據的指針。

請注意,在下面的示例中,結構大小保持為sizeof(void *)+ sizeof(node *),但為每個節點分配的數據大小使用用戶輸入進行更改。

typedef struct Dnode
{
    void* data;
    struct Dnode* next;
}Dnode;

Dnode* CreateDnode(size_t data_size_bytes)
{
    Dnode* newNode = NULL;

    newNode =  malloc(sizeof(Dnode));/*always the same*/
    if(NULL == newNode)
    {
        return NULL;
    }
    newNode->data =  malloc(data_size_bytes);/*changes by input*/
    if(NULL == newNode->data)
    {
        return NULL;
    }
    newNode->next = NULL;
    return newNode;
}

聽起來您可能正在尋找“柔性數組成員”功能,即將不完整的數組放置在結構的末尾:

struct ListNode {
  struct ListNode *next;
  char data[];
};

分配方式如下:

struct ListNode *node = malloc(sizeof *node + data_size_bytes);

然后,我們可以在存儲值的node->data[i]i0data_size_bytes - 1 整個結構和數據在一個線性塊中。

請注意,具有彈性成員的結構不能用作數組元素類型。

在ISO C標准於1999年添加靈活數組成員之前,它是使用大小為1的數組作為流行的“結構黑客”來完成的。如果您不得不在C90中工作,它將像這樣:

struct ListNode {
  struct ListNode *next;
  char data[1];
};

現在, sizeof ListNodesizeof ListNode包括一個元素數組, 並且很有可能用填充來對齊。 例如,在具有四個字節指針的系統上,大小很可能為八。 如果我們使用相同的malloc行,我們將分配多余的內存。 用於C90結構hack的正確的malloc表達式:

#include <stddef.h>

struct ListNode *node = malloc(offsetof(struct ListNode, data) + data_size_bytes);

與靈活數組成員功能不同,struct hack沒有形式上明確定義的行為。 它只是“如果有效就可以工作”的東西。

暫無
暫無

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

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