【发布时间】:2015-05-24 22:36:21
【问题描述】:
这有点令人难以置信
我会尽力解释我的疑问。
例如检查这个函数:
void snoc(Lint *l, int val){
Lint i, new;
new = (Lint) malloc(sizeof(Nodo));
new->value = val;
new->next = NULL;
i=(*l);
while(i->next!=NULL){
i=i->next;
}
i->next = new;
}
我理解背后的概念,并且我在使用列表时没有问题,考虑到我无法使用列表初始指针本身迭代列表(如果我这样做,我会丢失初始指针)
问题是,创建 i=(*l) 并随后使用 i=i->next 遍历列表,会使 i 变量不断变化。
在这个特定的例子中,原始列表不会改变,直到我找到链表的末尾,然后我做一个归属,瞧!我在最后插入一个元素。
我的疑问是,如果通过更改i,并在末尾设置i->next = new,这是否意味着每次我设置i=i->next,都会更改原始列表中的所有节点?
另一个例子是 init:
void init (Lint *l){
Lint i, prev;
i=(*l);
prev=NULL;
while(i!=NULL){
if( (i->next)->next==NULL){
i->next = NULL;
}
i=i->next;
}
}
如果我这样做,最后一个元素将在适当的时候通过将i->next 更改为 NULL 来删除。但在此之前,我一直在对i 本身进行更改,告诉i=i->next
如果我要对(*l) 本身进行此更改(通过执行(*l)=(*l)->next),我将破坏原始列表。
我真的希望你们能理解我的疑问。
【问题讨论】:
-
请提供
Lint的定义。 -
Lint和Nodo的定义会有所帮助。我认为Nodo是一个结构,而Lint是一个Nodo *? -
请不要使用“new”作为变量名:Lint i, new;还是我理解不正确?
标签: c list linked-list