【问题标题】:What is the list that is being built by this code?此代码正在构建的列表是什么?
【发布时间】:2015-07-13 01:15:29
【问题描述】:

谁能告诉我这个程序正在构建的确切列表是什么? (程序不运行,这很好)。此外,您可以向我指出与制作列表有关的任何代码行,我们将不胜感激,我在跟踪这个程序时遇到了麻烦。

我似乎看到的是,它似乎是一个节点的链接列表,其中包含来自“值”的数据?不过我也不知道,只是迷路了。

   #include <stdio.h>
   #include "sNode.h"

    int main()
    {
       int i;
       int rV = 0;
       List l = NULL;
       char* input[] = { "06", "24", "3" };
       sNode *s, *t;

       for( i=0; i<3; ++i )
       {
          t = (sNode*)malloc( sizeof( sNode ));
          if( t == NULL )
          {
             fprintf( stderr, "Couldn't get memory for a node!  Exiting." );
             rV = 1;
             break;
          }
          t->data = input[i];
          t->next = l;
          l = t;
       }


       s = l;
       while( s != NULL )
       {
          t = s->next;
          free( s );
          s = t;
       }

       return rV;
}

【问题讨论】:

  • 您应该发布整个代码,包括所有#includes 以及sNodeList 之类的定义。此外,最好表明您实际上尝试自己理解代码。解释您的思考过程以及您遇到困难的地方,以便我们帮助您进行下一步。
  • 我很抱歉......它已经被编辑了......而且,我似乎看到的是它似乎是一个链接列表,其中包含来自“值”的数据?不过我不知道,只是迷路了。
  • the program does not run 然后,根据定义,它也不构建任何列表。 I'm having trouble tracing this program什么麻烦?具体来说,似乎是什么问题?
  • @DtownDom 你忘记了最后一个右括号。:) 这是一个单链接的 kist。每个节点有两个数据成员:第一个是 char * (char *data;) 类型,第二个是 sNode * (sNode *next;) 类型。什么不清楚?
  • 这是我第一次查看链表、节点等。很多代码对我来说都是全新的。我没有编写代码,也没有试图让代码运行,我只是想了解原作者想要做什么(我可以看出他们正在尝试列出一个列表,但我能做到的就这么多弄清楚)。

标签: c list singly-linked-list


【解决方案1】:

l 指向链表的头部。 所以 l 被赋值为 NULL 开头,即空链表。

在 for 循环的第一次迭代中,创建了一个节点并为其分配了值“06”。 l 设置为指向新创建的节点。所以你有:

l ---> ("06", NULL)

在 for 循环的第二次迭代中,创建了一个节点并为其分配了值“24”。 l 设置为指向新创建的节点。所以你有:

l ---> ("24", next=---)---> ("06", next=NULL)

在 for 循环的第三次迭代中,创建了一个节点并将其赋值为“3”。 l 设置为指向新创建的节点。所以你有:

l ---> ("3", next=---)---> ("24", next=---)---> ("06", next=NULL)

最后你有一个链表,元素被插入到前面。

【讨论】:

    【解决方案2】:

    如何跟踪程序的对象

    这里我们正在查看l,因为它属于List 类型,即相关对象。更改l 的行是

    int main()
    {
            List l = NULL;
            for( i=0; i<3; ++i )
            {
                    l = t;
            }
    }
    

    看来t 被分配给l 所以我们看看t

    int main()
    {
        List l = NULL;
        sNode *s, *t;
    
        for( i=0; i<3; ++i )
        {
                t = (sNode*)malloc( sizeof( sNode ));
                if( t == NULL )
                {
                        fprintf( stderr, "Couldn't get memory for a node!  Exiting." );
                        rV = 1;
                        break;
                }
                t->data = input[i];
                t->next = l;
                l = t;
        }
        while( s != NULL )
        {
                t = s->next;
        }
    

    现在更清楚发生了什么。 malloc 正在为t 的地址分配sNode 大小的动态内存。根据http://www.cplusplus.com/reference/iterator/next/t-&gt;next 指向下一个元素(它通过t-&gt;next = l 重新分配给l。继续这样做;提示你看s next since @ 987654337@ 正在被更改。看来t 的成员数据正在被重新分配,具体来说它现在等于&amp;input + sizeof(i) 的输入。

    【讨论】:

      猜你喜欢
      • 2019-05-04
      • 1970-01-01
      • 2010-11-24
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 2020-02-20
      相关资源
      最近更新 更多