【问题标题】:List of a List in CC中的列表列表
【发布时间】:2014-02-17 19:47:26
【问题描述】:

我正在尝试动态分配指向结构指针的指针列表,每个结构指针都包含具有以下定义的结构列表:

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

我有几个问题:

  1. 这是解决此类问题的正确实现方式吗?
  2. 如何访问较大列表中每个列表的第一个节点的text 数据成员?

如果我的问题含糊不清,请告诉我。我对这个话题的困惑使我很难正确地表达我的问题。

【问题讨论】:

  • 你的 typedef 没有用。您使用单词“list”(和变量名list)来指代列表和数组。当您不清楚您是否有任何层正常工作时,您正在尝试使用间接塔。你必须从简单的问题开始,解决复杂的问题,否则你肯定会失败。
  • 看起来您正在尝试构建一个包含指向多个链表头部的指针的数组,对吧?第二部分 list[i] = malloc(sizeof(struct node*) * subArraySize); 有点误导,因为您提前分配了几个 nodes 的连续内存块,而通常您可能会在创建每个节点时为其分配内存,或者至少您不会'不要使用这个结构,它是一个非常严格的二维数组。
  • 如果您试图创建一个指向链表的动态指针数组,则辅助 malloc 没有任何意义。后者是一个链表,因此不需要向量分配(假设next 成员不只是用于装饰橱窗或其他邪恶目的)。也就是说,您真正要解决的问题是什么,带有冲突链的哈希表?

标签: c list memory


【解决方案1】:

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

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

这将创建一个node** 数组(称为list,因为您想这样称呼它,但我会称它为其他名称,表示它是一个基于node 的链表数组),然后实例化一个块每个头 node 的内存,以便 list 充满有效的 node*s,您可以开始使用它们。

当您将某些内容附加到每个链接列表时,您会执行类似的操作(这会附加到末尾,如果您想要排序数据等,则由您根据比较值实现插入) :

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;

它还可以帮助您了解this question 关于将typedef 与链接列表一起使用的信息。

如果我在我的代码中出现任何语法或语义错误,我深表歉意,我已经有一段时间没有编写 C 语言了,我可能对如何引用 structs 感到生疏。欢迎指正。

【讨论】:

    猜你喜欢
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    相关资源
    最近更新 更多