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;
}
我无法解释这个伪代码。任何人都可以向我解释这个程序是如何工作和流动的吗?鉴于此伪代码在链表中搜索值,而列表按升序排列,该程序将返回什么?
一个。列表中的最大值小于目标
湾列表中的最大值小于或等于目标
C。列表中的最小值大于或等于目标
d。目标
即列表中的最小值大于目标
并说List是[1,2,4,5,9,20,20,24,44,69,70,71,74,77,92]和目标15,发生了多少次比较? (这里,比较意味着比较目标的价值)
编辑: @Stephen如果我粗鲁地问我的问题,我很抱歉。
好吧,因为我习惯用Visual Basic编程,所以我理解程序第4行中的'cur-> key'为'cur大于或等于key',但是因为'+ ='意味着'前值加后一个值等于后一个值',我可以解释' - >'与'+ ='的方式相同这部分是我面临的问题之一。
我面临的第二个问题是在Record_node中使用指针(如果它是一个指针)。我甚至不确定我是否知道我不知道的事情!我理解这个程序是一种递归算法。
答案 0 :(得分:2)
好吧,因为我习惯用Visual Basic编程,所以我理解程序第4行中的'cur-> key'为'cur大于或等于key',但是因为'+ ='意味着'前值加后一个值等于后一个值',我可以解释' - >'与'+ ='的方式相同这部分是我面临的问题之一。
这就是问题所在,我很高兴你澄清了这一点:)
此代码以c
(或c++
)编写。该语言使用->
取消引用指针并指向结构的成员。 IIRC,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
顺便说一下,真实的大于或等于运算符是>=
。
node* Sequential_search(List *list, int target) {
if (!list) return NULL;
if (target == list->key) return list;
return Sequential_search(list->next, target);
}
希望有所帮助!
答案 1 :(得分:0)
您可能会发现它对review a list of C operators and their precedence很有帮助,特别是来自VB。我鼓励你勇敢地跳进链接列表首先 ..但是你可能想花一些时间在开始列表实现之前获得指针的基础知识。
这是Stephen's great answer的补充,我已经投了票。