struct Record_node* Sequential_search(struct Record_node *List, int target) {
struct Record_node *cur;
cur = List->head ;
if(cur == NULL || cur->key >= target) {
return NULL;
}
while(cur->next != NULL) {
if(cur->next->key >= target) {
return cur;
}
cur = cur->next;
}
return cur;
}我不能解释这个伪代码。有人能给我解释一下这个程序是如何工作和流动的吗?给定这个在链表和升序列表中搜索值的伪代码,该程序将返回什么?
a.列表中小于target的最大值
b.列表中小于或等于target的最大值
c.列表中大于或等于target的最小值
d.目标
e.列表中大于target的最小值
假设列表是1,2,4,5,9,20,20,24,44,69,70,71,74,77,92和target 15,发生了多少次比较?(在这里,比较是指比较目标值)
编辑:@Stephen如果我问的问题太粗鲁了,我很抱歉。
因为我习惯于用Visual Basic编程,所以我把程序第4行中的“cur->key”理解为“cur大于或等于key”,但由于“+=”的意思是“前一个值加上后一个值等于后一个值”,我可以用和“+=”相同的方式解释“->”,这部分是我面临的问题之一。
我面临的第二个问题是在Record_node中使用指针(如果它是一个指针)。我甚至不确定我是否知道我不知道的东西!我把这个程序理解为某种递归算法。
发布于 2010-05-16 22:23:07
因为我习惯于用Visual Basic编程,所以我把程序第4行中的“cur->key”理解为“cur大于或与key相同”,但由于“+=”的意思是“前一个值加上后一个值等于后一个值”,我可以用和“+=”相同的方式解释“->”,这部分是我面临的问题之一。
这就是问题所在,我很高兴您澄清了这一点:)
这段代码是用c (或c++)编写的。该语言使用->解除对指针的引用,并指向结构的成员。VB没有指针,所以你可能会说struct.member或cur.next。
while (cur->next != NULL) { // While current's next node isn't NULL.
}NULL被用来表示列表的结尾。
计算cur->next->key意味着“当前节点之后的节点的关键字”。如果您绘制一个具有升序数值的链表并跟踪程序,它可能会帮助您可视化这一点。
在while循环执行过程中的某个时刻,您将拥有以下内容:
+-+ +-+ +-+
|2|--|4|--|7|--NULL
+-+ +-+ +-+
^ ^ ^
| | |
head cur cur->next顺便说一句,真正大于或等于的运算符是>=。
BTW2,它不是递归的。递归是一个调用自身的函数(你可以递归地实现它)。这个函数是迭代的(它使用循环)。递归算法的一个例子是:
node* Sequential_search(List *list, int target) {
if (!list) return NULL;
if (target == list->key) return list;
return Sequential_search(list->next, target);
}希望这能有所帮助!
发布于 2010-05-16 22:29:53
你可能会发现它对review a list of C operators and their precedence很有帮助,尤其是来自VB。我为你的勇敢而鼓掌,因为你首先进入了一个链接列表..但在开始list实现之前,您可能希望花一些时间了解指针的基础知识。
这是对Stephen's great answer的补充,我已经向上投票了。
https://stackoverflow.com/questions/2844008
复制相似问题