【发布时间】:2020-06-29 19:30:45
【问题描述】:
我正在处理列表,我对 hasNext() 的工作原理有点困惑。 我以为会是这样的:
int hasNext(const listADT list) {
return list->current->tail!= NULL;
}
但我见过这样写的:
int hasNext(const listADT list) {
return list->current != NULL;
}
我不确定哪个是正确的。我认为最后一个元素应该指向 NULL。如果不是这样,并且第二个版本是正确的,那是否意味着 NULL 被算作列表的最后一个元素?
编辑:我正在尝试编写一个 listADT 来处理一般的列表,除了在当前节点有下一个节点时返回 1 的函数之外,我没有尝试做任何特定的事情。
这是列表的结构:
typedef struct listCDT {
struct node * first;
size_t size;
node * current;
} listCDT;
还有节点的:
typedef struct node {
elemType elem;
struct node * tail;
} node;
提前致谢。
【问题讨论】:
-
在非循环列表中,最后一个元素应指向
NULL。 -
如果不知道您的实际列表结构以及节点字段的用途,则无法判断。
-
如果
list->current是NULL,list->current->tail将尝试取消引用NULL。 -
这两个函数都没有多大意义。在链表上,您通常拥有对
first元素的引用,也称为head,每个元素都拥有对next元素的引用,最后一个元素的next属性设置为NULL,表示没有下一个元素。该列表不包含对“当前”元素的引用,这只有您的迭代器应该知道,因此您不应该将list传递给函数并期望它将current元素排除在外它,当然你可以把它设计成那样,但它没有多大意义。 -
@Dan 这个问题应该被关闭,因为没有提供列表定义就没有意义。