【问题标题】:Linked list function that determines if values are in strictly ascending order确定值是否严格升序的链表函数
【发布时间】:2011-05-05 21:26:22
【问题描述】:

我在下面编写了一个函数,它接受一个指向链表前面的指针,并确定该链表中的值是否以严格的升序存储。如果是这种情况,函数应该返回 1;否则它应该返回 0。

 struct listnode {
    int data;
    struct listnode* next;
 };

 int ascendingOrder(struct listnode* front) {

 struct listnode* current = front; 

 if(current->data == NULL)
    return current->data; 

 while(current->next != NULL) {

     if(current->data < current->next->data)
         return 1; 
     }

     else
         return 0; 

     } 
 }

这行得通吗?如果行不通怎么办?

【问题讨论】:

  • sn-p 甚至无法编译。有一个 else 没有对应的 if
  • 同时检查一个有 1 个单节点的列表会发生什么:)
  • 我编辑了代码,但我不确定我是否做了正确的更正
  • 另外,请始终缩进您的代码。
  • 即使在您编辑之后,它仍然有一个悬空的else。与您的缩进级别保持一致,以便轻松找到这些错误。

标签: c linked-list


【解决方案1】:

我看到一些看起来不正确的事情。对于初学者,您的版本甚至无法编译。此外,如果第一项小于第二项,您的函数将返回。它甚至不检查其他项目。

我会做更多这样的事情(未经测试)。

int IsAscending(struct listnode* node)
{
    if (node == NULL)
        return TRUE;

    while(node->next != NULL)
    {
        if (node->data > node->next->data)
            return FALSE;
        node = node->next;
    }
    return TRUE;
}

【讨论】:

  • +1 ...但是“严格”位呢?列表1 -&gt; 2 -&gt; 2 -&gt; 3 不是严格升序的。
  • @pmg:我并不完全清楚 OP 想要什么。当然,如果你想要它描述的方式,你可以将比较从&gt; 更改为 `>='。
【解决方案2】:

这不起作用,因为您在比较前两个列表项后返回。您可以输入“继续;” (或将其留空)您的 return 1 所在的位置,然后将 return 1 放在程序末尾的 while 循环之外。这样,如果它遇到 current > next 的点,它只会返回 0,如果它通过所有项目而没有发生这种情况,则返回 1。此外,您的括号已关闭,在 return 1 之后您有一个额外的。并且您永远不会将当前节点更改为下一个节点,您必须将其设置在 while 循环的底部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2020-07-26
    相关资源
    最近更新 更多