使用排序的链接列表进行顺序搜索

时间:2010-05-16 13:57:42

标签: c linked-list

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中使用指针(如果它是一个指针)。我甚至不确定我是否知道我不知道的事情!我理解这个程序是一种递归算法。

2 个答案:

答案 0 :(得分:2)

  

好吧,因为我习惯用Visual Basic编程,所以我理解程序第4行中的'cur-> key'为'cur大于或等于key',但是因为'+ ='意味着'前值加后一个值等于后一个值',我可以解释' - >'与'+ ='的方式相同这部分是我面临的问题之一。

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

此代码以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

顺便说一下,真实的大于或等于运算符是>=

BTW2,它不是递归的。递归将是一个调用自身的函数(你可以递归地实现它)。这个函数是迭代的(它使用循环)。递归算法的一个例子是:

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的补充,我已经投了票。