简单链表构建代码解释

Explanation of Simple Linked List Building code

我正打算使用这段代码来构建单向链表。我指出了让我有点困惑的台词。

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->数据);

不明白数据如何存储到指针和结构上下文中的 'data' 字段?

链表与数组有何不同?考虑以下几点:

  • 数组是一种静态数据结构。这意味着数组的长度不能在 运行 时间改变。而链表是动态数据结构。
  • 在数组中,所有元素都保存在连续的内存位置,而在链表中,元素(或节点)可以保存在任何位置,但仍然相互连接。

    1. 所以考虑到动态创建链表的目的我们不知道用户会创建多少个节点。

      Therefore in this case to allocate memory dynamically, pointers are used. Using pointers will give you the memory location for your struct.

    2. scanf()的作用是接受数据并将其存储到内存位置。在这里,您接受数据的整数值到名为 new_node 的结构中。所以假设你的 new_node 是这样的:

    new_node = {int data | struct node *next} 此处您要接受整数字段的值 data

    scanf 将存储您在 new_node 数据的地址位置键入的任何值。

Here "1" represents your new_node->data accepted and "NULL" is new_node->next the pointer to next node.

point1: 将结构节点声明为指针有什么好处?

您可以使用指向结构的指针作为函数参数而不是结构本身,以避免复制结构。当你传递一个结构时,编译器会复制该结构。

point2: scanf("%d",&new_node->data);

箭头运算符(->) 用于通过指针变量访问结构成员。 上面的 scanf 语句 new_node 是访问结构成员 data 的指针变量。

这个操作类似于我们使用普通结构变量访问结构成员的点运算符 (.)。

0a) 指针仅保存内存地址,编译器依赖于您的声明来确定从该地址(从 *ptr 到 *ptr + size)有多少内存被视为对象的一部分。

0b) 在结构节点中,您正在保存 'next' 节点的地址,而不是保存 'next' 节点的值。这意味着在任何时候每个节点都只有一个副本。

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 指向的地址。所以 &ptr->data 基本上是 == 数据地址。