我即将使用此代码构建单链表。我指出让我有点困惑的线条。
struct node
{
int data;
struct node *next;
}*start=NULL; // point 1
void creat()
{
char ch;
do
{
struct node *new_node,*current;
new_node=(struct node *)malloc(sizeof(struct node));
printf("\nEnter the data : ");
scanf("%d",&new_node->data); //point 2
new_node->next=NULL; // point 3
if(start==NULL)
{
start=new_node;
current=new_node;
}
else
{
current->next=new_node;
current=new_node;
}
printf("\nDo you want to creat another : ");
ch=getche();
}while(ch!='n');
}
point1:将结构节点声明为指针有什么好处?
point2:scanf("%d",& new_node->数据);
无法了解数据如何存储在“数据”中。指针和结构的上下文中的字段?
答案 0 :(得分:1)
链接列表与数组的不同之处?请考虑以下几点:
在数组中,所有元素都保存在连续的内存位置,而在链表中,元素(或节点)可以保留在任何位置,但仍然相互连接。
因此,考虑到动态创建链表的目的,我们不知道用户将创建多少个节点。
因此,在这种情况下,动态分配内存,使用指针。 使用指针将为您提供内存位置 为你的结构。
scanf()的目的是接受数据并将其存储到内存位置。在这里,您接受将数据的interger值转换为struct new_node
。假设您的new_node
类似于:
new_node = {int data | struct node *next}
在此您要接受整数字段data
scanf将存储您将在new_node
数据的地址位置输入的值。
这里" 1"表示您接受的new_node->数据和" NULL"是 new_node-> next指向下一个节点的指针。
答案 1 :(得分:0)
point1:将结构节点声明为指针有什么好处?
您可以使用指针结构作为函数参数而不是结构本身,以避免复制struct。当您传递struct编译器时,会生成该结构的副本。
第2点:scanf("%d",&new_node->data);
箭头运算符( - >)用于通过指针变量访问结构的成员。
上面的scanf
语句new_node
是指针变量,它正在访问结构的成员data
。
此操作类似于Dot Operator(。),我们使用普通结构变量访问结构成员。
答案 2 :(得分:0)
0a)指针只保存内存地址,编译器依赖你的声明来确定从该地址(从* ptr到* ptr + size)的内存被认为是对象的一部分。
0b)在结构节点内,您保存“下一个”节点的地址,而不是保存“下一个”节点的值。这意味着在任何时候每个节点只有一个副本。
1)} * start = NULL;声明一个名为start的结构节点指针是一种简单的方法,初始值为NULL,这意味着它指向任何东西。
2a)声明类型为struct node 的指针让编译器知道在指针之后它可以预期sizeof(struct node)后面的内存量是可读的。显然你必须预先对该内存进行malloc,否则会发生错误。最后,“ptr-> data”等同于“(* ptr).data”,它取消引用指针,然后请求结构节点的数据元素。
2b)
的形式int x;
scanf("%d",&x);
将& x(x的地址)传递给函数,该函数读取一个int并将其指向& x指向的AT地址。所以& ptr->数据基本上是==数据地址。