Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何编写函数来测试链表是否已排序_C++_Sorting_Object_Struct_Linked List - Fatal编程技术网

C++ 如何编写函数来测试链表是否已排序

C++ 如何编写函数来测试链表是否已排序,c++,sorting,object,struct,linked-list,C++,Sorting,Object,Struct,Linked List,我看了其他帖子,没有找到一个很好的解决方案。我不想对链表进行实际排序,我想看看它是否已排序。我在C++中有一个链表问题。我被要求对给定链表定义的函数进行编码,以查看其是否已排序 实现函数isSorted–如果链表中的值按递增顺序排序,则返回true。(链表由整数组成) 鉴于以下情况: struct ListNode { double value; // The value in this node struct ListNode *next;

我看了其他帖子,没有找到一个很好的解决方案。我不想对链表进行实际排序,我想看看它是否已排序。我在C++中有一个链表问题。我被要求对给定链表定义的函数进行编码,以查看其是否已排序

实现函数isSorted–如果链表中的值按递增顺序排序,则返回true。(链表由整数组成)

鉴于以下情况:

struct ListNode
   {
      double value;           // The value in this node
      struct ListNode *next;  // To point to the next node
   }; 
样本数据:从isSorted返回
1->3->7正确
4->2->7错误
()True//空列表
3正确
1->5->7->2错误

我有这样的东西

bool NumberList::isSorted() const
{
   ListNode *nodePtr;  // To move through the list
   nodePtr = head;

   while (nodePtr)
   {
      if(nodePtr->value <= nodePtr->value+1)
         nodePtr = nodePtr->next;
      else 
         return false;

       return true;
   }
}
bool NumberList::isSorted()常量
{
ListNode*nodePtr;//在列表中移动
nodePtr=头部;
while(nodePtr)
{
if(nodePtr->value+1)
nodePtr=nodePtr->next;
其他的
返回false;
返回true;
}
}
我不确定我是否做对了,我需要帮助。
谢谢。

如果列表按升序排序,则对于您使用的比较函数,每个节点的值都大于或等于上一个节点的值。也就是说,这些值永远不会减少。只需遍历节点并进行检查

注意:您所显示的条件

nodePtr->value <= nodePtr->value+1
nodePtr->value+1
不检查任何合理值:它检查值是否小于或等于该值加1


一个更合理的条件是将
nodePtr->value
与前一个节点的值进行比较。要轻松做到这一点,您需要在上一次迭代中存储上一个节点的值(或指向上一个节点的指针)。在某些变量中。

也许这会起作用

bool NumberList::isSorted() const
{
    ListNode *nodePtr;
    nodePtr = head;
    double d;

    if (!nodePtr) return true; // Empty list

    // Save value of current node
    d = nodePtr->value;

    // Point to next node
    nodePtr = nodePtr->next;

    while (nodePtr)
    {
        if(d > nodePtr->value) return false; // Not sorted

        // Save value of current node
        d = nodePtr->value;

        // Point to next node
        nodePtr = nodePtr->next;
    }

    return true;
}
#包括
使用名称空间std;
结构节点
{
int数据;
结构节点*下一步;
};
空插入(结构节点*p,int x)
{
结构节点*q=新节点;
while(p->next!=NULL)
{
p=p->next;
}
p->next=q;
q->data=x;
q->next=0;
}
无效打印列表(结构节点*p)
{
while(p)
{
coutdata>p->下一步->数据)
返回false;
p=p->next;
}
返回true;
}
int main()
{
结构节点*head=新节点;
结构节点*second=新节点;
结构节点*第三个=新节点;
头部->数据=1;
头->下一个=秒;
第二->数据=2;
第二->下一个=第三个;
第三->数据=3;
第三->下一步=空;
插入(头,4);
插入(头,56);
插入(头,100);
印刷品清单(标题);

国际单项体育联合会(总)?coutYour
返回true;
应该在循环外,而不是循环内。很好,谢谢。@DieterLücking没有必要粗鲁。我在逻辑上遇到了困难,这就是为什么我发布了这个问题。是的,我被要求测试我的列表是否按升序排序。我列出了给定的样本数据-在inst中是正确的仅当值未按升序排序时,才会指定和false。我理解您的语句,如何修复它以检查给定的选项。因此,根据您的建议,我将声明一个值集,该值集等于nodePtr->value。然后在我的循环中迭代,如果我下面的值大于前面设置的临时值。我可以您必须在每次迭代时更新我的临时值吗?请注意,除了测试访问的节点是否按升序进行比较外,还必须测试节点计数是否符合您的预期,以防您的链接列表代码不知何故遗漏了一个节点或无意中破坏了一个
上一个
下一个
链接。请尝试se注释以指导并提供附加信息。