Array of Linked Lists in C: initializing and inserting?
我需要创建一个链接列表数组(如图所示),这是我到目前为止所做的:
1 2 3 4 5 6 7 8 9 10 11 12 | typedef struct Node { int data; struct Node *next; } Node; int main(void) { Node* link[5]; for(int q = 0; q < 5; q++) { link[q] = malloc(sizeof(struct Node)); link[q] = NULL; } } |
自从我在C语言中使用链表以来已经有一段时间了,所以我已经忘记了很多语法,而且在可视化编码链表时究竟会发生什么。 如果我没记错的话,当我在代码中调用malloc时,是否正在创建一个没有任何内容的Node?
我想初始化它以指向NULL。 我做到了
1 | link[q] = NULL; |
我说对了,这是对的吗?
| 1 | ->空
| 2 | ->空
| 3 | ->空
我的下一个问题是将数据插入到链表中。
(参考图片):如果我想在数组的第三个索引中插入另一个元素([3]-> d-> NULL)
这是正确的吗?
1 2 3 | Node* newNode = link[3]; newNode->data = 1; link[3] = newNode; |
感谢您的帮助!
据我了解您的程序,以下陈述是不必要的:
link [q] = malloc(sizeof(struct Node));
由于您需要从NULL指针开始,因此link [q] = NULL;很好
要在列表中插入项目,您应该为每个项目分配内存,因此它应该变成这样:
1 2 3 4 | Node* newNode = malloc(sizeof(struct Node)); newNode->data = 1; newNode->next = link[3]; link[3] = newNode; |
尽管我没有测试它,它应该可以工作。
这个循环
1 2 3 4 5 | Node* link[5]; for(int q = 0; q < 5; q++) { link[q] = malloc(sizeof(struct Node)); link[q] = NULL; } |
导致内存泄漏,因为首先分配了内存,然后指针被NULL覆盖。因此,分配的内存的地址将丢失。
你可以写
1 | Node* link[5] = { 0 }; |
这是一个演示程序,该程序演示如何将节点添加到列表数组的元素。类型为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | #include <stdio.h> #include <stdlib.h> typedef struct Node { char data; struct Node *next; } Node; int push_front( Node **head, char data ) { Node *new_node = malloc( sizeof( Node ) ); int success = new_node != NULL; if ( success ) { new_node->data = data; new_node->next = *head; *head = new_node; } return success; } void output( Node **head ) { for( Node *current =*head; current != NULL; current = current->next ) { printf("%c", current->data ); } printf("%s","NULL" ); } void display( Node **set, size_t n ) { for ( size_t i = 0; i < n; i++ ) { output( set++ ); putchar( '\ ' ); } } #define N 5 int main(void) { Node * link[N] = { 0 }; push_front( &link[0], 'b' ); push_front( &link[0], 'a' ); push_front( &link[1], 'c' ); push_front( &link[2], 'd' ); display( link, sizeof( link ) / sizeof( *link ) ); return 0; } |
程序输出为
1 2 3 4 5 | a b NULL c NULL d NULL NULL NULL |
您已经有5个指向节点的指针数组,即
1 2 | for (size_t i = 0; i < sizeof link / sizeof *link; ++i) link[i] = NULL; |
在这里,您不应该分配任何新的存储,因为您不需要实际的节点,只需要指向节点的指针并且已经有了它们。
您的代码首先分配,然后立即用
当您要实际创建节点时,即需要分配它并将其链接到正确的列表中。
首先,最好的检查方法是不确定是否要看到它-打印它。
其次,您的代码中有错误-
1 2 |
在这里,您将新指针的大小设置为void *,其大小为
我的建议,选择2,仅在需要添加新节点分配时使用。