C++ 如何编写函数来测试链表是否已排序
我看了其他帖子,没有找到一个很好的解决方案。我不想对链表进行实际排序,我想看看它是否已排序。我在C++中有一个链表问题。我被要求对给定链表定义的函数进行编码,以查看其是否已排序 实现函数isSorted–如果链表中的值按递增顺序排序,则返回true。(链表由整数组成) 鉴于以下情况: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;
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注释以指导并提供附加信息。