【问题标题】:Sequential searching with sorted linked lists使用排序链表进行顺序搜索
【发布时间】:2010-05-16 13:57:41
【问题描述】:
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。目标
e.列表中大于目标的最小值

并且说 List 是 [1, 2, 4, 5, 9, 20, 20, 24, 44, 69, 70, 71, 74, 77, 92] 和目标 15,发生了多少次比较? (这里的比较是指比较target的值)

编辑: @Stephen 如果我问我的问题很粗鲁,我很抱歉。

好吧,因为我习惯用 Visual Basic 编程,所以我将程序第 4 行中的 'cur->key' 理解为 'cur is greater than or same as key',但由于 '+=' 意味着 'former value加上后一个值等于后一个值',我可以将'->'解释为'+ ='这部分是我面临的问题之一。

我面临的第二个问题是在 Record_node 中使用指针(如果它是指针)。我什至不确定我是否知道我不知道的事情!我将这个程序理解为某种递归算法。

【问题讨论】:

  • 我不认为这是伪代码。
  • 这里有很多人可以告诉你。首先告诉我们您的想法(以及原因)。

标签: c linked-list


【解决方案1】:

好吧,因为我习惯用 Visual Basic 编程,所以我将程序第 4 行中的 'cur->key' 理解为 'cur is greater than or same as key',但由于 '+=' 意味着 'former value加上后一个值等于后一个值',我可以将'->'解释为'+ ='这部分是我面临的问题之一。

这就是问题所在,我很高兴你澄清了这一点:)

此代码是用c(或c++)编写的。该语言使用-> 取消引用指针并指向结构的成员。 IIRC,VB没有指针,所以你会说struct.membercur.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);
}

希望有帮助!

【讨论】:

  • 我喜欢 ascii 图 :) +1,这应该对他有帮助。
【解决方案2】:

您可能会发现它对review a list of C operators and their precedence 很有帮助,尤其是来自 VB。 首先你勇敢地跳入链接列表,我为你鼓掌。但在开始实现列表之前,你可能想花一些时间了解指针的基础知识。

这是对Stephen's great answer 的补充,我对此表示赞同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多