C语言中的列表

C语言中的列表,c,list,memory,C,List,Memory,我试图将指针列表动态分配给结构指针,每个结构指针都包含一个定义如下的结构列表: struct node { char *text; struct node *next; }; 我也在使用typedef: typedef struct node Node; 我正在创建一个节点列表,通过声明以下内容来保存每个列表: Node **list; list = (struct node**) malloc(sizeof(struct node*) * arraySize); 在

我试图将指针列表动态分配给结构指针,每个结构指针都包含一个定义如下的结构列表:

struct node {
     char *text;
     struct node  *next; };
我也在使用typedef:

typedef struct node Node;
我正在创建一个节点列表,通过声明以下内容来保存每个列表:

Node **list;
list = (struct node**) malloc(sizeof(struct node*) * arraySize);
list
的每个节点上,我将创建另一个列表,如下所示:

list[i] = malloc(sizeof(struct node*) * subArraySize);
我有几个问题:

  • 这是解决此类问题的正确方法吗
  • 如何访问较大列表中每个列表的第一个节点的
    文本
    数据成员

  • 如果我的问题含糊不清,请让我知道。我对这个话题的困惑使我很难恰当地表达我的问题

    假设您的内存已正确分配和填充,您可以通过以下方式访问较大的
    节点**
    数组中每个
    节点*的第一个节点的
    文本
    数据成员:

    list[i]->text
    
    但是,要回答您关于实现是否正确的问题,这并不是真的。您可能会更乐意这样做:

    struct node **list;
    list = (struct node**) calloc(sizeof(struct node*) * arraySize);
    for (int i=0; i<arraySize; ++i) {
        list[i] = (struct node*) malloc(sizeof(struct node));
        list[i]->text = ""; // or whatever you want to start with
        list[i]->next = NULL;
    }
    
    它还可以帮助您了解如何在链表中使用
    typedef


    如果我在代码中犯了任何语法或语义错误,我很抱歉,我写C已经有一段时间了,我可能对如何引用
    struct
    s有些生疏。欢迎更正。

    您的typedef没有任何作用。您可以使用单词“list”(以及变量名
    list
    )来表示列表和数组。当不清楚是否有任何层正常工作时,您正在尝试使用间接塔。你必须从简单的问题开始,逐步解决复杂的问题,否则你肯定会失败。看起来你正在尝试构建一个数组,其中包含指向多个链表头的指针,对吗?第二部分,
    list[i]=malloc(sizeof(struct node*)*subraysize)
    是一种误导,因为您提前为几个
    节点
    分配了一个连续的内存块,而通常您可能会在创建每个节点时为其分配内存,或者至少你不会使用这种严格意义上的2d数组结构。如果你试图创建指向链表的指针的动态数组,那么第二个malloc就没有意义了。后者是一个链表,因此不需要向量分配(假设
    next
    成员不只是为了粉饰门面或其他邪恶目的)。也就是说,您真正想要解决的问题是什么,一个带有冲突链的哈希表?
    int i = index_where_you_want_to_insert;
    struct node *currNode = list[i];
    struct node *newNode = (struct node*) malloc(sizeof(struct node));
    newNode->text = ""; // or whatever you want to start with
    newNode->next = NULL;
    while(currNode->next != NULL) {
        currNode = currNode->next;
    }
    currNode->next = newNode;