【问题标题】:What does each line do in this Linked List program?这个链表程序中的每一行都做了什么?
【发布时间】:2013-12-11 01:36:26
【问题描述】:

这是我正在处理的链接列表,并试图弄清楚每一行的确切作用。我学习编程的方式似乎非常困难,我感到非常沮丧。无论如何,我了解链接列表的工作原理,但我不了解代码在说什么以及它究竟在做什么来创建结构。例如:我不明白您为什么要为节点(13 和 14)分配一个指针,尤其是当我对指针的理解是它们用于存储内存位置时。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

struct numnode
{
    int val; 
    struct numnode * next;
};
typedef struct numnode node;

main()
{
    int i;
    node * head;
    node * newnode;
    head = NULL;

    for (i = 1; i <= 10; i++)
    {
        newnode = (node *) malloc(sizeof(node));
        newnode->val = i;
        newnode->next = NULL;

        if (head == NULL)
        {
            head = newnode;
        }
        else
        {
            newnode->next = head;
            head = newnode;
        }
    }
}

【问题讨论】:

  • if (head = NULL) head == null 不应该是这样吗?
  • 要了解每一行的作用,请在调试器中运行代码。这将让您一次执行一行代码。

标签: c linked-list computer-science


【解决方案1】:

这里有一些注释(以及一些小的编辑以减少代码量)。

/* Linked list node definition */
struct node {
    int val; 
    struct node * next;
};

int main() {
    int i;
    struct node *head, *new_node;
    head = NULL;
    for (i = 1; i <= 10; i++) {
        // Allocate a new node and initialize its components (val and next)
        new_node = (struct node *) malloc(sizeof(node));
        new_node->val = i;
        new_node->next = NULL;

        // The if block is actually not necessary...
        if (head == NULL) {
            // If the linked list is empty, set the head pointer to the initial node
            head = new_node;
        } else {
            // Now that you have your new node, connect it. Start:
            // head->[current linked list]
            // [new_node.next]->NULL

            new_node->next = head;
            // head->[current linked list]->...
            // [new_node.next]->[current linked list]->...

            head = newnode;
            // head->[new_node.next]->[current linked list]->...
        }
    }
}

关键是malloc 返回一个指向内存的指针。每个新节点都是动态分配的,因此是内存中的一个位置(不是基本类型)。

【讨论】:

  • 所以当 malloc 启动时它会创建一个指针,因此该指针被分配给 new_node,对吗?在malloc(节点*)之前有指针有什么意义? (第 7 行从 main 开始,包括 main。)这到底是什么意思?
  • 抱歉,打错了。 malloc 返回 void * 类型的指针,(struct node *) 是一个类型转换,告诉编译器将指针视为 struct node *。在这种情况下没有明确要求,但这是一种很好的做法。
【解决方案2】:

如果您修复PakkuDon 指出的语句,您会发现代码插入到头部。它将以一个列表结束,其值从 9 下降到 1。

【讨论】:

    【解决方案3】:

    指针只是告诉你价值在哪里的东西,就像电话号码一样,你可以打电话给任何人,因为你知道号码。指针可以指向任何你想要的东西(在你的访问权限下) ,不管是int还是struct。

    【讨论】:

      【解决方案4】:

      以下是这段代码的摘要:

      #include <stdio.h>
      #include <stdlib.h>
      #include <math.h>
      
      struct numnode
      {
          int val; 
          struct numnode * next;
      };
      typedef struct numnode node;
      
      main()
      {
          int i;
          node * head;
          node * newnode;
          head = NULL;
      
          for (i = 1; i <= 10; i++)
          {
              newnode = (node *) malloc(sizeof(node));
              newnode->val = i;
              newnode->next = NULL;
      
              if (head == NULL)  // It'll be NULL first time, as head = NULL.
              {
                  // True @ i = 1
                  head = newnode;
              }
              else // Afterwards, as head=newnode
              {
                  // New node will be created every time. Till i <= 10.
                  newnode->next = head;
                  head = newnode;
              }
          }
      }
      

      这是一个简单的代码。

      PS:是head == NULL

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-16
        • 2019-06-01
        • 2012-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-11
        • 1970-01-01
        相关资源
        最近更新 更多