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

时间:2014-12-22 18:48:23

标签: c++ sorting object struct linked-list

我查看了其他帖子,并没有为我的查询找到一个很好的解决方案。我不想对链接列表进行实际排序,我想查看它是否已排序。我在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;
   }
}

我不确定我是否正确行事,我需要帮助。 谢谢。

3 个答案:

答案 0 :(得分:2)

也许这会奏效......

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;
}

答案 1 :(得分:1)

如果列表按升序排序,那么对于比较功能,您使用每个节点的值大于或等于前一个节点。即价值永远不会减少。只需遍历节点并检查它。

注意:您显示的条件

nodePtr->value <= nodePtr->value+1

不会检查任何合理的内容:它会检查某个值是否小于或等于该值加1。

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

答案 2 :(得分:0)

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int data;
    struct node* next;
};
void insert(struct node* p,int x)
{
    struct node* q=new node;
    while(p->next!=NULL)
    {
        p=p->next;
    }
    p->next=q;
    q->data=x;
    q->next=0;

}
void printlist(struct node* p)
{
    while(p)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
}
bool ifsorted(struct node* p)
{
    while(p->next!=NULL)
    {
        if(p->data>p->next->data)
            return false;
        p=p->next;


    }
    return true;

}
int main()
{
   struct node* head=new node;
   struct node* second=new node;
   struct node* third=new node;
   head->data=1;
   head->next=second;
   second->data=2;
   second->next=third;
   third->data=3;
   third->next=NULL;
   insert(head,4);
   insert(head,56);
   insert(head,100);
   printlist(head);
   ifsorted(head)?cout<<"Sorted":cout<<"Not sorted";

}