简单链接列表构建代码的说明

时间:2015-07-08 06:04:24

标签: c pointers linked-list structure

我即将使用此代码构建单链表。我指出让我有点困惑的线条。

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

无法了解数据如何存储在“数据”中。指针和结构的上下文中的字段?

3 个答案:

答案 0 :(得分:1)

链接列表与数组的不同之处?请考虑以下几点:

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

    1. 因此,考虑到动态创建链表的目的,我们不知道用户将创建多少个节点。

        

      因此,在这种情况下,动态分配内存,使用指针。   使用指针将为您提供内存位置   为你的结构。

    2. scanf()的目的是接受数据并将其存储到内存位置。在这里,您接受将数据的interger值转换为struct new_node。假设您的new_node类似于:

    3. 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->数据基本上是==数据地址。