#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
指针的值会被正确地修改。