【问题标题】:Explanation of Simple Linked List Building code简单链表构建代码说明
【发布时间】:2015-07-08 06:04:24
【问题描述】:

我正在接近使用此代码来构建单链表。我指出让我有点困惑的台词。

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

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

【问题讨论】:

  • 缩进,缩进 =)
  • 你知道指针的用途和用途吗?
  • 谨防将scanf("%d", …) 与任何“获取字符”例程一起使用。 scanf() 在输入缓冲区中留下一个换行符以供读取。 getche() 例程特定于 Windows,我不确定它是否清除缓冲区并要求输入新的单个字符,但如果没有,您的代码似乎行为不端,而不是等待您的答案提示。
  • @JonathanLeffler:很好的报价提醒 :)

标签: c pointers linked-list structure


【解决方案1】:

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

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

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

      因此,在这种情况下,为了动态分配内存,使用了指针。 使用指针会给你内存位置 为你的结构。

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

    new_node = {int data | struct node *next}这里你想接受你的整数字段的值data

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

这里的“1”代表你的新节点->接受的数据,“NULL”是 new_node->next 指向下一个节点的指针。

【讨论】:

    【解决方案2】:

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

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

    1) }*开始=NULL;是声明一个名为 start 且初始化值为 NULL 的结构节点指针的简写方式,这意味着它指向任何内容。

    2a) 声明 struct node 类型的指针让编译器知道,在指针之后,它可以预期它后面的 sizeof(struct node) 内存量是可读的。显然,您必须事先分配该内存,否则会发生错误。最后,“ptr->data”等价于“(*ptr).data”,解引用指针,然后请求结构节点的数据元素。

    2b)

    的形式
    int x; 
    scanf("%d",&x);
    

    将 &x(x 的地址) 传递给函数,该函数读取一个 int 并将其置于 &x 指向的地址处。所以 &ptr->data 基本上是 == 数据的地址。

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-04
        • 2021-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多