2014-02-17 124 views
1

我试图动态分配指针列表结构,每个包含结构列表如下定义的指针:名单在C列表

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数据成员?

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

+1

您的typedef没有任何用处。您使用单词“list”(和变量名称“list”)来引用列表和数组。当您不清楚您有任何图层正常工作时,您正试图使用​​间接塔。你必须先从简单的问题入手,并处理复杂的问题,否则你肯定会失败。 – Beta

+1

看起来你试图构建一个包含指向几个链表头的数组,对吧?第二部分,'list [i] = malloc(sizeof(struct node *)* subArraySize);'是一种误导,因为您提前为多个'节点'分配了连续的内存块,而通常您可能会在创建时为每个节点分配内存,或者至少你不会使用这个非常严格的二维数组结构。 – 2rs2ts

+2

如果您尝试制作指向链接列表的动态数组指针,则辅助malloc没有任何意义。后者是*链接列表*,因此不需要分配矢量(假设“下一个”成员不仅仅是出于窗口修饰或其他恶意目的)。那就是说,你真的试图解决什么问题,一个带有碰撞链的散列表? – WhozCraig

回答

2

假设你的内存分配,并正确填写,你会通过访问较大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*,您可以开始使用它们。

当你去附加一些东西给每个链表时,你会做这样的事情(这会追加到最后,如果你想要排序的数据等,你可以根据比较值实现插入。 ):

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并且我可能会生锈以至于如何引用struct s。我欢迎更正。