Need help in sorting a singly linked list...

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • malik
    New Member
    • Aug 2006
    • 4

    Need help in sorting a singly linked list...

    // Linked Lists in classes(excludi ng structures) without using tail pointer

    # include<iostrea m.h>
    # include<stdlib. h>

    void Swap(int num1, int num2)
    {
    int a = num1;
    num2 = num1;
    num2 = a;
    }

    class node
    {
    private:
    int data;
    node* next;
    node* headptr;
    public:
    node()
    {headptr = NULL;}
    void insert_at_head( int d)
    void insert_at_tail( int d);

    void display_all();

    void sort_ascending_ order(); // complicated
    void sort_descending _order(); // complicated



    };

    ///////////////////////////////////////////////////////////////////////////////

    void node::insert_at _head(int d)
    {
    node* ptr = new node;
    ptr->data = d;

    ptr->next = headptr;
    headptr = ptr;

    }

    void node::display_a ll()
    {
    node* tempptr = headptr;

    if(headptr == NULL)
    {cout<<"The list is empty"<<endl;}

    while(tempptr->next != NULL)
    {
    cout<<tempptr->data<<" , ";
    tempptr = tempptr->next;
    }

    if(tempptr->next == NULL)
    {cout<<tempptr->data;}
    }

    void node::insert_at _tail(int d)
    {
    node* temptr = new node;
    temptr->data = d;
    temptr->next = NULL;

    node* ptrCurrent = headptr;

    while(ptrCurren t->next != NULL)
    {
    ptrCurrent = ptrCurrent->next;

    }
    ptrCurrent->next = temptr;
    }





    void node::sort_asce nding_order()
    {
    node* realptr = headptr;
    node* ptrCurrent = headptr;

    while(ptrCurren t->next != NULL)
    {
    if(ptrCurrent->data > ptrCurrent->next->data)
    {
    realptr->data = ptrCurrent->data;
    cout<<realptr->data<<endl;

    Swap(ptrCurrent->data,ptrCurren t->next->data);
    }
    ptrCurrent = ptrCurrent->next;
    realptr = realptr->next;


    }

    }




    void main()
    {
    node n1;
    n1.insert_at_he ad(1);
    n1.insert_at_he ad(2);
    n1.insert_at_he ad(3);
    n1.insert_at_ta il();
    n1.insert_at_ta il();
    n1.display_all( );
    cout<<endl<<end l;

    cout<<"Testing Sorting"<<endl< <endl;
    n1.sort_ascendi ng_order();

    cout<<endl<<end l;
    n1.display_all( );

    }

    //void node::sort_asce nding_order() this is not working

    Please help me out using singly linked list and do keep the code less complicated. Thankx
  • Banfa
    Recognized Expert Expert
    • Feb 2006
    • 9067

    #2
    My computer just crashed at the end of me typing a long post, 'fraid I can be bother to type it all again but here are some pointers

    Your Swap function doesn't work (go on try it with 2 ints)

    You need to look up about static data members and static function members of classes

    You should always check your pointers, where you have already checked them you need to act on it not just continue as if everything was OK insert_at_head and insert_at_tail among other places

    In your print function your while loop has the wrong control expression and wont print the last list member, the final if statement is useless as the condition MUST be false for the while loop to exit.

    You can not perform an array sort in a single pass of the array, it is not possible. The realptr variable is confusing and useless, it always points to the same place as ptrCurrent.

    1 sort method is called a bubble sort, you scan down your list comparing adjacent pairs of entries. If the need swaping you swap them, when you get to the end of the list if you swapped any entries on this scan of the list then you scan the list again.

    1 possible method is

    Comment

    • malik
      New Member
      • Aug 2006
      • 4

      #3
      Thankx Banfa, God Bless u.

      Comment

      • alantangyl
        New Member
        • Dec 2006
        • 1

        #4
        void LinkList::sort( )
        {
        Node *q, *r;
        for( q = p ; q->link != NULL ; q = q->link )
        {
        for( r = q->link ; r->link != NULL ; r = r->link )
        {
        if (r->data<q->data)
        {
        int temp;
        temp = r->data;
        r->data = q->data;
        q->data = temp;
        }
        }
        }
        }

        Comment

        Working...