我正在尝试创建一个包含10个节点的列表,并使用值1到10进行分配并打印它们。我尝试使用以下代码,但最终我遇到了分段错误。
我对C中的链接列表很新。
#include<stdio.h>
typedef struct Node
{
int data;
struct Node *next;
}Node_Struct;
int main(void)
{
int i =0;
Node_Struct* Node = NULL;
Node = (Node_Struct*)malloc(sizeof(Node_Struct));
for (i = 1; i<=10; i++){
Node->data = i;
Node = Node->next;
}
for (i = 1; i<=10; i++){
printf("\n Node->data:%d",Node->data);
Node = Node->next;
}
return 0;
}
答案 0 :(得分:1)
正如评论中的人所指出的那样,你只是将内存分配给头节点。您需要为您尝试添加的每个节点分配内存,以及for循环。此外,您在每次迭代时向前移动Node
指针,因此在插入后您将无法遍历列表。跟踪列表的头部和尾部。执行以下操作:
维护链表的头尾:
Node_Struct* headNode = NULL, *tailNode = NULL;
// head node
headNode = tailNode = (Node_Struct*)malloc(sizeof(Node_Struct));
在循环中的每次迭代中分配内存。您是否想要保留头节点中的内容,这是您的愿望。所以改变for循环中的代码如下:
for (i = 1; i<=10; i++) {
Node_Struct* newNode = (Node_Struct *)malloc(sizeof(Node_Struct));
newNode->data = i;
newNode->next = NULL;
tailNode->next = newNode;
tailNode = newNode;
}
在此之后,您可以通过在其他变量中复制head值来迭代列表:
Node_Struct *tmpNode = headNode;
for (i = 1; i<=10; i++){
printf("\n Node->data:%d",tmpNode->data);
tmpNode = tmpNode->next;
}
答案 1 :(得分:1)
您没有为每个添加的节点分配内存。
如果要使用你的循环,那么就足以进行这些微小的改变
Node_Struct* Node = NULL;
Node_Struct **current = &Node;
for (i = 1; i <= 10; i++ ) {
*current = malloc(sizeof(Node_Struct));
(*current)->data = i;
(*current)->next = NULL;
current = &(*current)->next;
}
current = &Node;
for (i = 1; i <= 10; i++) {
printf("\n Node->data:%d", ( *current )->data);
current = &( *current )->next;
}
考虑到在退出程序之前应该为节点释放所有已分配的内存。
答案 2 :(得分:0)
您只为一个节点分配了空间,但是您尝试通过这样做来遍历链接节点列表:
for (i = 1; i<=10; i++){
Node->data = i;
Node = Node->next;
}
执行此操作时,Node = Node->next;
,Node
可能指向任何地方。你可能指着你不应该触摸的记忆。
要记住的一件事是永远不要把手柄放到列表的头部。通过保留副本来保持指向列表头部的指针。
Node = malloc(sizeof(Node_Struct));
Node_Struct *head = Node;
使用malloc()
为每个节点分配空间。首先构建节点列表。一种方法是这样的:
for (i = 1; i<=10; i++){
Node->next = malloc(sizeof (Node_Struct));
Node = Node->next;
}
Node->next = NULL // The last node should point to NULL
之后,您可以在另一个循环中设置节点的所有data
字段,或者在执行malloc()
时将它们设置在同一个循环中。由于您已经拥有列表head
的句柄,因此您知道从哪里开始。像这样:
Node = head;
i = 0;
while (Node) {
Node->data = i++;
Node = Node->next;
}
答案 3 :(得分:0)
首先,我告诉你你的错误在哪里,我已经重新编写了代码来解决你的问题。查看我的代码并与您的代码进行比较。希望能帮助您学习数据结构。
让我们看看你的错误
#include<stdio.h>
typedef struct Node
{
int data;
struct Node *next;
}Node_Struct;
int main(void)
{
int i =0;
Node_Struct* Node = NULL;
Node = (Node_Struct*)malloc(sizeof(Node_Struct));
for (i = 1; i<=10; i++){
Node->data = i;/* till here everything fine */
Node = Node->next; /* now you are pointing to nowhere */
/* in the next iteration of for loop Node->data = i will crash the application */
/* you could have done it like below
Node->next = (Node_Struct*)malloc(sizeof(Node_Struct));
Node = Node->next;
Node->data = i;
Node->next = NULL
but here you lost the address of first node so all gone*/
}
for (i = 1; i<=10; i++){
printf("\n Node->data:%d",Node->data);
Node = Node->next;
}
return 0;
}
现在看下面的代码
int main(void)
{
int i =0;
Node_Struct *Node = NULL;
Node_Struct *p = NULL;
for (i = 1; i<=10; i++){
if ( Node == NULL )
{
Node = (Node_Struct*)malloc(sizeof(Node_Struct));
Node->data = i;
Node->next = NULL;
p = Node; /* p is pointing to the first Node of the list */
}
else
{
p->next = (Node_Struct*)malloc(sizeof(Node_Struct));
p = p->next;
p->data = i;
p->next = NULL;
}
}
p = Node; /* now p is pointing to first node of the link list */
/* if you see above we always assign NULL to 'next' pointer so that the last node of the list pointing to NULL */
/* Therefore in the below while loop we are searching the list untill we reach the last node */
while( p != NULL )
{
printf("\n p->data:%d",p->data);
p = p->next;
}
return 0;
}