对于链表添加函数代码中主函数和add函数中head问题的认识

#include<stdio.h>
#include<stdlib.h> 
#include"node.h"
int main()
{
	int number = 0;
	node* head = NULL;
	while (number != -1) {
		scanf("%d", &number);
		if (number != -1) {
			head = add(number, head);
		}
		else { break; }
	}
	return 0;
}
node* add(int number, node* head)
{
	node* p = (node*)malloc(sizeof(node));
	p->value = number;
	p->next = NULL;
	node* last = head;

	if (last)
	{
		while (last->next) {
			last = last->next;
		}
		last->next = p;
	}
	else {
		head = p;
	}
	return head;
}

在主函数中,head 是一个指针变量,它存储了链表的头节点的地址。当调用 add 函数时,主函数将传入的 head 参数复制到函数参数 head 中。在 add 函数内部,对 head 的修改只是对复制的副本进行操作,不会影响主函数中的 head

故而需要将head返回进行主函数中head的更新。

也可以进行指针传递

在 C 语言中,函数参数传递是按值传递的,即传递的是参数的副本而不是参数本身的地址。因此,即使在函数内部对参数进行修改,也不会影响到外部的原始变量。

要使 add 函数中的修改影响主函数中的 head,可以使用引用传递(在 C++ 中)或指针传递(在 C 中)的方式,将 head 指针的地址传递给函数,然后在函数内部通过该地址来修改原始的 head 指针。

下面是一个使用指针传递的示例,其中 add 函数会修改主函数中的 head

#include <stdio.h>  
#include <stdlib.h>  
  
typedef struct node {  
    int value;  
    struct node* next;  
} node;  
  
void add(int number, node** head_ptr) {  
    node* p = (node*)malloc(sizeof(node));  
    p->value = number;  
    p->next = NULL;  
    node* last = *head_ptr;  
  
    if (last) {  
        while (last->next) {  
            last = last->next;  
        }  
        last->next = p;  
    } else {  
        *head_ptr = p;  
    }  
}  
  
int main() {  
    int number = 0;  
    node* head = NULL;  
    while (number != -1) {  
        scanf("%d", &number);  
        if (number != -1) {  
            add(number, &head);  
        } else {  
            break;  
        }  
    }  
    // ...继续处理链表...  
    return 0;  
}

在上面的示例中,add 函数接受一个指向 node* 的指针 head_ptr,通过指针解引用 head_ptr 来修改 head 指针的值。这样,在主函数中调用 add 函数时,head 指针的值会被正确地修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nuc-x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值