头节点未在范围外更新 [单链表]
Head Node not updated outside Scope [Single Linked List]
我已经解释了我目前卡在底部的位置。
下面这个结构是我的节点.
struct node {
int data;
struct node *next;
}
struct node *head;
我已经为头节点分配了内存。
head = malloc(sizeof(struct node));
并通过
创建了一堆链接到它的其他节点
struct node *temp;
for (int i=0; i < no_of_nodes - 1; i++)
{
struct node *n = malloc(sizeof(struct node));
temp -> next = n;
printf("Enter Node %d data : ", i+1);
scanf("%d", &(n -> data));
temp = n;
}
temp -> next = NULL;
然后我的 printNodes 函数
void printNodes(struct node *n)
{
//printf("%d", n -> data);
while(n != NULL)
{
if (n -> next != NULL)
printf("%d%s", n -> data, " -> ");
else
printf("%d%s", n -> data, " -> NULL\n");
n = n->next;
}
}
输出如下:6 -> 7 -> 8 -> 9 -> 3 -> NULL
现在,我试图在头节点插入一个节点,即它成为头节点,原来的头成为第二个节点。
printf("Enter the head position (obviously 0) : ");
scanf("%d", &pos);
insertNode(head, pos);
printNodes(head);
插入节点函数:
void insertNode (struct node *head, int pos)
{
struct node *n;
n = malloc(sizeof(struct node));
printf("Enter the Node data : ");
scanf("%d", &(n -> data));
if (pos == 0)
{
printf("Pos was 0, so HEAD\n");
n -> next = head;
head = n;
printNodes(head);
}
}
好的,所以问题是,printNodes(head)
实际上按预期打印了..
但是
printNodes(head);
after insertNodes(head, pos)
不打印更新的链表,
为什么头部没有更新?
我哪里做错了?
我得到的输出是,
输出:
输入Head位置(显然是0):0
输入节点数据:34
Pos 为 0,所以 HEAD
34 -> 6 -> 7 -> 8 -> 9 -> 3 -> NULL [from printNodes(head) inside insertNodes(head, pos)]
6 -> 7 -> 8 -> 9 -> 3 -> NULL [from printNodes(head) after insertNodes(head, pos)]
如果有人想看完整代码,
here你去吧
感谢任何帮助..
提前谢谢你。
函数insertNode
按值接受指向头节点的指针。也就是说,它处理指向头节点的原始指针值的副本。更改副本不会反映在原始指针上。原指针保持不变
您需要通过引用传递指针。
在 C 中,通过引用传递对象意味着通过指向它的指针间接传递对象。取消引用指针,您将直接访问引用的对象。
函数至少可以这样看
int insertNode( struct node **head, size_t pos )
{
struct node *n = malloc( sizeof( struct node ) );
int success = n != NULL;
if ( success )
{
printf( "Enter the Node data : " );
scanf( "%d", &n->data );
while ( *head != NULL && pos-- )
{
head = &( *head )->next;
}
n->next = *head;
*head = n;
}
return success;
}
并且该函数被调用为
insertNode( &head, pos );
我已经解释了我目前卡在底部的位置。
下面这个结构是我的节点.
struct node {
int data;
struct node *next;
}
struct node *head;
我已经为头节点分配了内存。
head = malloc(sizeof(struct node));
并通过
创建了一堆链接到它的其他节点struct node *temp;
for (int i=0; i < no_of_nodes - 1; i++)
{
struct node *n = malloc(sizeof(struct node));
temp -> next = n;
printf("Enter Node %d data : ", i+1);
scanf("%d", &(n -> data));
temp = n;
}
temp -> next = NULL;
然后我的 printNodes 函数
void printNodes(struct node *n)
{
//printf("%d", n -> data);
while(n != NULL)
{
if (n -> next != NULL)
printf("%d%s", n -> data, " -> ");
else
printf("%d%s", n -> data, " -> NULL\n");
n = n->next;
}
}
输出如下:6 -> 7 -> 8 -> 9 -> 3 -> NULL
现在,我试图在头节点插入一个节点,即它成为头节点,原来的头成为第二个节点。
printf("Enter the head position (obviously 0) : ");
scanf("%d", &pos);
insertNode(head, pos);
printNodes(head);
插入节点函数:
void insertNode (struct node *head, int pos)
{
struct node *n;
n = malloc(sizeof(struct node));
printf("Enter the Node data : ");
scanf("%d", &(n -> data));
if (pos == 0)
{
printf("Pos was 0, so HEAD\n");
n -> next = head;
head = n;
printNodes(head);
}
}
好的,所以问题是,printNodes(head)
实际上按预期打印了..
但是
printNodes(head);
after insertNodes(head, pos)
不打印更新的链表,
为什么头部没有更新?
我哪里做错了?
我得到的输出是, 输出:
输入Head位置(显然是0):0
输入节点数据:34
Pos 为 0,所以 HEAD
34 -> 6 -> 7 -> 8 -> 9 -> 3 -> NULL [from printNodes(head) inside insertNodes(head, pos)]
6 -> 7 -> 8 -> 9 -> 3 -> NULL [from printNodes(head) after insertNodes(head, pos)]
如果有人想看完整代码, here你去吧
感谢任何帮助.. 提前谢谢你。
函数insertNode
按值接受指向头节点的指针。也就是说,它处理指向头节点的原始指针值的副本。更改副本不会反映在原始指针上。原指针保持不变
您需要通过引用传递指针。
在 C 中,通过引用传递对象意味着通过指向它的指针间接传递对象。取消引用指针,您将直接访问引用的对象。
函数至少可以这样看
int insertNode( struct node **head, size_t pos )
{
struct node *n = malloc( sizeof( struct node ) );
int success = n != NULL;
if ( success )
{
printf( "Enter the Node data : " );
scanf( "%d", &n->data );
while ( *head != NULL && pos-- )
{
head = &( *head )->next;
}
n->next = *head;
*head = n;
}
return success;
}
并且该函数被调用为
insertNode( &head, pos );