此代码正在构建的列表是什么?
What is the list that is being built by this code?
谁能告诉我这个程序正在构建的确切列表是什么? (程序没有运行,这很好)。此外,如果您能向我指出与制作列表相关的任何代码行,我们将不胜感激,我在跟踪该程序时遇到了问题。
我好像看到的是'values'数据好像是一个节点链表?不过我不知道,只是迷路了。
#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;
}
如何跟踪程序的对象
我们在这里查看 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->next
指向下一个元素(它正在通过 t->next = l
重新分配给 l
。继续这样做;提示 你接下来看一下 s
,因为 s
正在被改变。看来 t
的成员数据正在被重新分配,具体来说,它现在等于 &input + sizeof(i)
的输入。
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)
最后你有一个链表,其中元素被插入到前面。
谁能告诉我这个程序正在构建的确切列表是什么? (程序没有运行,这很好)。此外,如果您能向我指出与制作列表相关的任何代码行,我们将不胜感激,我在跟踪该程序时遇到了问题。
我好像看到的是'values'数据好像是一个节点链表?不过我不知道,只是迷路了。
#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;
}
如何跟踪程序的对象
我们在这里查看 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->next
指向下一个元素(它正在通过 t->next = l
重新分配给 l
。继续这样做;提示 你接下来看一下 s
,因为 s
正在被改变。看来 t
的成员数据正在被重新分配,具体来说,它现在等于 &input + sizeof(i)
的输入。
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)
最后你有一个链表,其中元素被插入到前面。