#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node *link;
};
int main(int argc, char *argv[]) {
struct node *p;
p = NULL;
Append(&p , 1); // Append adds a node to the end of linked list
Append(&p , 2);
Append(&p , 3);
AddatBeginning (p, 100);
Display(p); // Displays Elements of Linked List
return 0;
}
// The function AddatBeginning adds a node at the beginning of linked list 'p'
void AddatBeginning (struct node *p, int num)
{
struct node *f, *temp = NULL;
f = p;
temp = (struct node *)malloc (sizeof(struct node));
temp->data = num;
temp->link = f;
p=temp;
}
我在 DevC++ 中运行代码,但没有得到预期的输出 - 100, 1, 2, 3。
我得到的输出是 1,2,3.
在调试代码时,我发现表达式“p=temp;”在函数“AddatBeginning”中不起作用。 P 没有指向执行语句后 temp 所指向的位置。为什么会这样?
您正在按值传递指针
p
AddatBeginning (p, 100);
这意味着该函数处理原始传递指针的副本。任何类似副本的更改
p=temp;
保持原来的指针不变。
这是一个函数参数,它是函数的局部变量,由传递的参数的值初始化,并且在函数内处理这个单独的局部变量。
您需要通过引用传递指针
p
。在 C 中,通过引用传递意味着通过指向对象的指针间接传递对象。因此,取消引用传递的指针,您可以直接访问原始对象,而原始对象又可以是指针。
所以该函数将如下所示
int AddatBeginning (struct node **p, int num)
{
struct *temp = malloc( sizeof( struct node ) );
int success = temp != NULL;
if ( success )
{
temp->data = num;
temp->link = *p;
*p = temp;
}
return success;
}
并且可以这样称呼
AddatBeginning( &p, 100 );
或
if ( !AddatBeginning( &p, 100 ) )
{
// error message
}
顺便说一下功能
Append
Append(&p , 1);
^^
通过引用接受原始指针。:)
注意被调用的函数在使用前必须在程序中声明。