Sorting a linked list in C












5















I'm trying to sort a linked list by finding the largest value, deleting it from its position, and then inserting it at the top of the list.



The difficulty I'm running into is the actual deleting and inserting at the top. The issue seems to be in the if condition in the while loop contained within the sortList function, but I'm not sure how to fix it.



Any help would be appreciated.



#include <stdio.h>
#include <stdlib.h>

typedef struct node{
int num;
struct node *next;
} Node, *NodePtr;

void printList(NodePtr np);
NodePtr makeList(void);
NodePtr makeNode(int n);
NodePtr sortList(NodePtr list);

int main(void) {
NodePtr list;
printf("Enter numbers for the list (0 to end)n");
list = makeList();
printList(list);
list = sortList(list);
printList(list);
return 0;
}

NodePtr makeList(void) {
NodePtr makeNode(int), np, top, last;
int n;
top = NULL;
if(scanf("%d", &n) != 1)n = 0;
while(n != 0) {
np = makeNode(n);
if(top == NULL)top = np;
else last->next = np;
last = np;
if(scanf("%d", &n)!=1)n=0;
}
return top;
}


void printList(NodePtr np) {
while(np != NULL) {
printf("%dn", np->num);
np = np->next;
}
}

NodePtr makeNode(int n) {
NodePtr np = (NodePtr)malloc(sizeof(Node));
np->num = n;
np->next = NULL;
return np;
}

NodePtr sortList(NodePtr list) {
NodePtr top = list;
NodePtr curr = NULL;
NodePtr largest;
NodePtr prev;
prev = NULL;
curr = top;
largest = top;

while(curr != NULL) {
prev = curr;
if(curr->num > largest->num) {
largest = curr;
prev->next = curr->next;
largest->next = top;
}
curr = curr->next;
}
if(prev == NULL) {
largest->next = top;
return largest;
}
return largest;
}









share|improve this question




















  • 2





    There are a number of questions about sorting linked lists in C; many of them are listed as related questions on the RHS of the page. Did you look at any of them to see if they are relevant to your problem?

    – Jonathan Leffler
    Aug 5 '12 at 3:24
















5















I'm trying to sort a linked list by finding the largest value, deleting it from its position, and then inserting it at the top of the list.



The difficulty I'm running into is the actual deleting and inserting at the top. The issue seems to be in the if condition in the while loop contained within the sortList function, but I'm not sure how to fix it.



Any help would be appreciated.



#include <stdio.h>
#include <stdlib.h>

typedef struct node{
int num;
struct node *next;
} Node, *NodePtr;

void printList(NodePtr np);
NodePtr makeList(void);
NodePtr makeNode(int n);
NodePtr sortList(NodePtr list);

int main(void) {
NodePtr list;
printf("Enter numbers for the list (0 to end)n");
list = makeList();
printList(list);
list = sortList(list);
printList(list);
return 0;
}

NodePtr makeList(void) {
NodePtr makeNode(int), np, top, last;
int n;
top = NULL;
if(scanf("%d", &n) != 1)n = 0;
while(n != 0) {
np = makeNode(n);
if(top == NULL)top = np;
else last->next = np;
last = np;
if(scanf("%d", &n)!=1)n=0;
}
return top;
}


void printList(NodePtr np) {
while(np != NULL) {
printf("%dn", np->num);
np = np->next;
}
}

NodePtr makeNode(int n) {
NodePtr np = (NodePtr)malloc(sizeof(Node));
np->num = n;
np->next = NULL;
return np;
}

NodePtr sortList(NodePtr list) {
NodePtr top = list;
NodePtr curr = NULL;
NodePtr largest;
NodePtr prev;
prev = NULL;
curr = top;
largest = top;

while(curr != NULL) {
prev = curr;
if(curr->num > largest->num) {
largest = curr;
prev->next = curr->next;
largest->next = top;
}
curr = curr->next;
}
if(prev == NULL) {
largest->next = top;
return largest;
}
return largest;
}









share|improve this question




















  • 2





    There are a number of questions about sorting linked lists in C; many of them are listed as related questions on the RHS of the page. Did you look at any of them to see if they are relevant to your problem?

    – Jonathan Leffler
    Aug 5 '12 at 3:24














5












5








5


4






I'm trying to sort a linked list by finding the largest value, deleting it from its position, and then inserting it at the top of the list.



The difficulty I'm running into is the actual deleting and inserting at the top. The issue seems to be in the if condition in the while loop contained within the sortList function, but I'm not sure how to fix it.



Any help would be appreciated.



#include <stdio.h>
#include <stdlib.h>

typedef struct node{
int num;
struct node *next;
} Node, *NodePtr;

void printList(NodePtr np);
NodePtr makeList(void);
NodePtr makeNode(int n);
NodePtr sortList(NodePtr list);

int main(void) {
NodePtr list;
printf("Enter numbers for the list (0 to end)n");
list = makeList();
printList(list);
list = sortList(list);
printList(list);
return 0;
}

NodePtr makeList(void) {
NodePtr makeNode(int), np, top, last;
int n;
top = NULL;
if(scanf("%d", &n) != 1)n = 0;
while(n != 0) {
np = makeNode(n);
if(top == NULL)top = np;
else last->next = np;
last = np;
if(scanf("%d", &n)!=1)n=0;
}
return top;
}


void printList(NodePtr np) {
while(np != NULL) {
printf("%dn", np->num);
np = np->next;
}
}

NodePtr makeNode(int n) {
NodePtr np = (NodePtr)malloc(sizeof(Node));
np->num = n;
np->next = NULL;
return np;
}

NodePtr sortList(NodePtr list) {
NodePtr top = list;
NodePtr curr = NULL;
NodePtr largest;
NodePtr prev;
prev = NULL;
curr = top;
largest = top;

while(curr != NULL) {
prev = curr;
if(curr->num > largest->num) {
largest = curr;
prev->next = curr->next;
largest->next = top;
}
curr = curr->next;
}
if(prev == NULL) {
largest->next = top;
return largest;
}
return largest;
}









share|improve this question
















I'm trying to sort a linked list by finding the largest value, deleting it from its position, and then inserting it at the top of the list.



The difficulty I'm running into is the actual deleting and inserting at the top. The issue seems to be in the if condition in the while loop contained within the sortList function, but I'm not sure how to fix it.



Any help would be appreciated.



#include <stdio.h>
#include <stdlib.h>

typedef struct node{
int num;
struct node *next;
} Node, *NodePtr;

void printList(NodePtr np);
NodePtr makeList(void);
NodePtr makeNode(int n);
NodePtr sortList(NodePtr list);

int main(void) {
NodePtr list;
printf("Enter numbers for the list (0 to end)n");
list = makeList();
printList(list);
list = sortList(list);
printList(list);
return 0;
}

NodePtr makeList(void) {
NodePtr makeNode(int), np, top, last;
int n;
top = NULL;
if(scanf("%d", &n) != 1)n = 0;
while(n != 0) {
np = makeNode(n);
if(top == NULL)top = np;
else last->next = np;
last = np;
if(scanf("%d", &n)!=1)n=0;
}
return top;
}


void printList(NodePtr np) {
while(np != NULL) {
printf("%dn", np->num);
np = np->next;
}
}

NodePtr makeNode(int n) {
NodePtr np = (NodePtr)malloc(sizeof(Node));
np->num = n;
np->next = NULL;
return np;
}

NodePtr sortList(NodePtr list) {
NodePtr top = list;
NodePtr curr = NULL;
NodePtr largest;
NodePtr prev;
prev = NULL;
curr = top;
largest = top;

while(curr != NULL) {
prev = curr;
if(curr->num > largest->num) {
largest = curr;
prev->next = curr->next;
largest->next = top;
}
curr = curr->next;
}
if(prev == NULL) {
largest->next = top;
return largest;
}
return largest;
}






c sorting linked-list singly-linked-list






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Aug 5 '12 at 8:55









dda

5,47822032




5,47822032










asked Aug 5 '12 at 3:19









maxmousemaxmouse

41124




41124








  • 2





    There are a number of questions about sorting linked lists in C; many of them are listed as related questions on the RHS of the page. Did you look at any of them to see if they are relevant to your problem?

    – Jonathan Leffler
    Aug 5 '12 at 3:24














  • 2





    There are a number of questions about sorting linked lists in C; many of them are listed as related questions on the RHS of the page. Did you look at any of them to see if they are relevant to your problem?

    – Jonathan Leffler
    Aug 5 '12 at 3:24








2




2





There are a number of questions about sorting linked lists in C; many of them are listed as related questions on the RHS of the page. Did you look at any of them to see if they are relevant to your problem?

– Jonathan Leffler
Aug 5 '12 at 3:24





There are a number of questions about sorting linked lists in C; many of them are listed as related questions on the RHS of the page. Did you look at any of them to see if they are relevant to your problem?

– Jonathan Leffler
Aug 5 '12 at 3:24












6 Answers
6






active

oldest

votes


















1














There is issues in the sortList function.



This function only put some large nodes in the beginning of the list. It is not soting all the list. you can you a sort algorithm to sort the file : quicksort/ bubblesort/...
i put a code doing a sort in the end of this answer.



here is a code doing the sort of the list :



//it is replacing largest node with first one then doing the same operation with sublist (list-first element)



NodePtr sortList(NodePtr list) 
{

//
if(list == null || list->next == null)
return list; // the list is sorted.

//replace largest node with the first :

//1- find largest node :
NodePtr curr, largest,largestPrev;
curr = list;
largest = list;
prev = list;
largestPrev = list;
while(curr != NULL) {
if(curr->num > largest->num) {
largestPrev = prev;
largest = curr;
}
prev = curr;
curr = curr->next;

}
//largest node is in largest.

//2- switching firt node and largest node :
NodePtr tmp;
if(largest != list)
{
largestPrev->next = list;
tmp = list->next;
list->next = largest->next;
largest->next = tmp;
}

// now largest is the first node of the list.

// calling the function again with the sub list :
// list minus its first node :
largest->next = sortList(largest->next);


return largest;
}





share|improve this answer





















  • 1





    Please correct your code (prev always point to the tail in your answer), you must add a new pointer largest_prev and you set it to prev in case of : if(curr->num > largest->num), then use it instead of prev (largest_prev->next = list)

    – TOC
    Aug 5 '12 at 14:52











  • @TOC : ty, done. more lisible code would be to use a function that search for largest element and a function that switch nodes.

    – Hicham from CppDepend Team
    Aug 6 '12 at 6:54











  • This algorithm does not work when you have a list like this: 524361

    – user1511417
    Feb 3 '15 at 20:12



















1














Here is my attempt to sort a singly linked list using QuickSort algorithm. If you know n then run time will be O(n log n). Check if this helps.



#include "malloc.h"

typedef struct node {
struct node *next;
int val;
} node;

bool insert_node(struct node **head, int val)
{
struct node *elem;
elem = (struct node *)malloc(sizeof(struct node));
if (!elem)
return false;
elem->val = val;
elem->next = *head;
*head = elem;
return true;
}

int get_lval(struct node *head, int l)
{
while(head && l) {
head = head->next;
l--;
}
if (head != NULL)
return head->val;
else
return -1;
}

void swap(struct node *head, int i, int j)
{
struct node *tmp = head;
int tmpival;
int tmpjval;
int ti = i;
while(tmp && i) {
i--;
tmp = tmp->next;
}
tmpival = tmp->val;
tmp = head;
while(tmp && j) {
j--;
tmp = tmp->next;
}
tmpjval = tmp->val;
tmp->val = tmpival;
tmp = head;
i = ti;
while(tmp && i) {
i--;
tmp = tmp->next;
}
tmp->val = tmpjval;
}


struct node *Quick_Sort_List(struct node *head, int l, int r)
{
int i, j;
int jval;
int pivot;
i = l + 1;
if (l + 1 < r) {
pivot = get_lval(head, l);
printf("Pivot = %dn", pivot);
for (j = l + 1; j <= r; j++) {
jval = get_lval(head, j);
if (jval < pivot && jval != -1) {
swap(head, i, j);
i++;
}
}
swap(head, i - 1, l);
Quick_Sort_List(head, l, i);
Quick_Sort_List(head, i, r);
}
return head;
}

struct node *Sort_linkedlist(struct node *head)
{
struct node *tmp = head;
// Using Quick sort.
int n = 0;

while (tmp) {
n++;
tmp = tmp->next;
}
printf("n = %dn", n);
head = Quick_Sort_List(head, 0, n);
return head;
}

void print_list(struct node *head)
{
while(head) {
printf("%d->", head->val);
head = head->next;
}
printf("n");
}

int _tmain(int argc, _TCHAR* argv)
{
struct node *head = NULL;
struct node *shead = NULL;

insert_node(&head, 10);
insert_node(&head, 12);
insert_node(&head, 9);
insert_node(&head, 11);
insert_node(&head, 7);
insert_node(&head, 1);
insert_node(&head, 3);
insert_node(&head, 8);
insert_node(&head, 5);
insert_node(&head, 2);
insert_node(&head, 4);
insert_node(&head, 6);
print_list(head);

shead = Sort_linkedlist(head);
print_list(shead);

return 0;
}





share|improve this answer































    0














    This should really help you. It's a very nice post.






    share|improve this answer
























    • Answers on Stack Overflow should generally stand on their own (although citations are great). If you'd like to share a link, you can do that in a comment.

      – Dietrich Epp
      Aug 5 '12 at 3:44













    • Lesson learnt. Will do.

      – Prasanth
      Aug 5 '12 at 3:46



















    0














    By writing to largest->next you overwrote curr->next. So you end up restarting from the top all the time.



    Make sure that:




    1. the list remains consistent

    2. your list iterator remains consistent


    But overall, your code seems to be heavily broken, I believe there might be a couple other errors in your sorting logic.






    share|improve this answer































      0














      The following are some of the problems which exist in your sorting logic:




      1. You are setting the prev pointer to curr in the beginning of the loop itself which is incorrect. By doing this, you are making the current pointer and the previous node pointer as same which makes it impossible to delete the node.

      2. You should assign the largest pointer also to top whereby it facilitates the possibility of setting the largest->next to real top node.


      The code can modified like below (Just a pointer, you need to check for other issues yourself):



      while(curr != NULL)
      {

      if(curr->num > largest->num)
      {
      largest = curr;
      prev->next = curr->next;
      largest->next = top;
      top = largest;

      }
      prev = curr;
      curr = curr->next;
      }





      share|improve this answer
























      • there still a pointer issue, curr will be top all the time : larger is pointing to the same node as curr. you put largest->next to top then curr->next points to top. when you write curr = curr->next, you actually put top in curr (because you have written top in largest (largest = curr in this point)). so you retart infinitly from top.

        – Hicham from CppDepend Team
        Aug 5 '12 at 10:33



















      0














      // Program to sort a single linked list in ascending order
      // (without exchanging data in the nodes)
      /**************************************************************************

      There are two methods of sorting presented here(At a time,we can use any of
      these two functions to sort our single linked list.) -

      1. Function 'void Sort()' - This function uses selection sort method(I
      think).
      In this function,a node whose data is the smallest in the list is made
      as 'head' node(i.e. starting node of the list) by scanning the whole list
      once.Then from the remaining list,again a node with the smallest data is
      found out whose address is kept in the 'next' field of previous node(head
      node).This process continues to sort the whole list.
      2. Function 'void Sort_method2()' - This function uses insertion sort
      method(I think).
      In this function,starting from second node in the list, all previous node
      data(starting from 'head' node) are compared with current reference node
      (which is initially second node in the list).If 'data' field of current
      reference node is smaller than that of any of its previous nodes,then
      suitable changes in the 'next' field of corresponding nodes are made.If
      data in the current reference node is smaller than that in the 'head' node,
      then the current reference node is made as 'head' node.

      *********************************************************************/

      #include<stdio.h>
      #include<conio.h>
      #include<alloc.h>
      #include<stdlib.h>

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

      struct node *head,*head1;

      void Create_node(int data);
      void display();
      void Sort();
      void Sort_method2();


      void main()
      {
      int choice,d;
      clrscr();
      while(1)
      {
      printf("n 1.Create new node");
      printf("n 2.Sort in ascending order");
      printf("n 3.Exit");
      printf("nEnter your choice : ");
      scanf("%d",&choice);

      switch(choice)
      {
      case 1: printf("nEnter data :");
      scanf("%d",&d);
      Create_node(d);
      break;
      case 2: Sort(); // At a time,we can use any of these two
      //Sort_method2(); // functions to sort our single linked list.
      break;
      case 3: exit(0);
      default:exit(0);
      }
      } // end of while(1)
      } // end of main()

      //--------------------------------------------
      void Create_node(int d)
      {
      struct node *newnode,*temp;
      newnode = (struct node *)malloc(sizeof(struct node));
      newnode -> data = d;
      newnode -> next = NULL;
      if(head == NULL)
      head = newnode;
      else
      {
      temp = head;
      while(temp -> next != NULL)
      temp = temp -> next;

      temp -> next = newnode;
      } // end of 'else'
      } // end of 'Create_node(int d)'

      //---------------------------------------------
      void display() // Print linked list contents
      {
      struct node *temp;
      printf("nList contents are :n");
      temp = head;
      while(temp != NULL)
      {
      printf(" Data = %d Address = %un",temp->data,temp);
      temp = temp->next;
      }
      printf("n");
      }
      //--------------------------------------------
      void Sort()
      {
      struct node *t,*t1,*t2,*t3;
      t1 = head;
      head1 = head;
      if(head == NULL)
      printf("nThe linked list is empty!");
      else
      {
      while( (t2 = t1 -> next) != NULL)
      {
      while(t2 != NULL)
      {
      t3 = t2 -> next;
      if( t1 -> data > t2 -> data)
      {
      t2 -> next = t1;
      for(t = t1; t -> next != t2;t = t -> next);

      t -> next = t3;
      t1 = t2; // t1 = Node with smaller data
      t2 = t3; // t2 = Node to be compared with t1
      } // end of 'if'
      else
      {
      // t1 = t1; // That is,no change in t1.
      t2 = t3;
      }
      } // end of ' while(t2 != NULL)'

      if(head == head1) // We want this action only for first pass of
      { // outer while() loop.Only initially, head = head1.
      head = t1;
      head1 = t1 -> next;
      } // end of 'if(head == head1)'
      else
      {
      for(t = head;t -> next != head1; t = t -> next);

      t -> next = t1;
      head1 = t1 -> next;
      } // end of 'else'

      t1 = t1 -> next;
      } // end of 'while( (t2 = t1 -> next) != NULL)'

      display(); // Display the list.
      } // end of 'else' of 'if(head == NULL)'
      } // end of 'Sort()'

      //--------------------------------------------
      void Sort_method2()
      {
      struct node *t,*t1,*t2,*tt;
      if(head == NULL)
      printf("nThe linked list is empty!");
      else
      {
      t1 = head -> next;
      while(t1 != NULL) // This is i-loop(outer loop).
      {
      t2 = t1 -> next;
      for(t = head; t != t1; t = t -> next) // This is j-loop(inner loop).
      {
      if(t1->data < t->data)
      {
      t1 -> next = t;
      for(tt=head; tt->next != t1; tt=tt->next); //end of for loop in 'if'

      tt -> next = t2;
      if(t == head)
      head = t1; // There is only one statement in this 'if'.
      else // i.e.,'if(t != head)'
      {
      for(tt=head; tt->next != t; tt=tt->next);

      tt -> next = t1;
      }
      break;
      } // end of 'if'
      } // end of outer 'for' loop
      t1 = t2;
      } // end of 'while'

      display(); // Display the list.
      } // end of 'else' of 'if(head == NULL)'
      } // end of 'Sort_method2()'





      share|improve this answer

























        Your Answer






        StackExchange.ifUsing("editor", function () {
        StackExchange.using("externalEditor", function () {
        StackExchange.using("snippets", function () {
        StackExchange.snippets.init();
        });
        });
        }, "code-snippets");

        StackExchange.ready(function() {
        var channelOptions = {
        tags: "".split(" "),
        id: "1"
        };
        initTagRenderer("".split(" "), "".split(" "), channelOptions);

        StackExchange.using("externalEditor", function() {
        // Have to fire editor after snippets, if snippets enabled
        if (StackExchange.settings.snippets.snippetsEnabled) {
        StackExchange.using("snippets", function() {
        createEditor();
        });
        }
        else {
        createEditor();
        }
        });

        function createEditor() {
        StackExchange.prepareEditor({
        heartbeatType: 'answer',
        autoActivateHeartbeat: false,
        convertImagesToLinks: true,
        noModals: true,
        showLowRepImageUploadWarning: true,
        reputationToPostImages: 10,
        bindNavPrevention: true,
        postfix: "",
        imageUploader: {
        brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
        contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
        allowUrls: true
        },
        onDemand: true,
        discardSelector: ".discard-answer"
        ,immediatelyShowMarkdownHelp:true
        });


        }
        });














        draft saved

        draft discarded


















        StackExchange.ready(
        function () {
        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f11813696%2fsorting-a-linked-list-in-c%23new-answer', 'question_page');
        }
        );

        Post as a guest















        Required, but never shown

























        6 Answers
        6






        active

        oldest

        votes








        6 Answers
        6






        active

        oldest

        votes









        active

        oldest

        votes






        active

        oldest

        votes









        1














        There is issues in the sortList function.



        This function only put some large nodes in the beginning of the list. It is not soting all the list. you can you a sort algorithm to sort the file : quicksort/ bubblesort/...
        i put a code doing a sort in the end of this answer.



        here is a code doing the sort of the list :



        //it is replacing largest node with first one then doing the same operation with sublist (list-first element)



        NodePtr sortList(NodePtr list) 
        {

        //
        if(list == null || list->next == null)
        return list; // the list is sorted.

        //replace largest node with the first :

        //1- find largest node :
        NodePtr curr, largest,largestPrev;
        curr = list;
        largest = list;
        prev = list;
        largestPrev = list;
        while(curr != NULL) {
        if(curr->num > largest->num) {
        largestPrev = prev;
        largest = curr;
        }
        prev = curr;
        curr = curr->next;

        }
        //largest node is in largest.

        //2- switching firt node and largest node :
        NodePtr tmp;
        if(largest != list)
        {
        largestPrev->next = list;
        tmp = list->next;
        list->next = largest->next;
        largest->next = tmp;
        }

        // now largest is the first node of the list.

        // calling the function again with the sub list :
        // list minus its first node :
        largest->next = sortList(largest->next);


        return largest;
        }





        share|improve this answer





















        • 1





          Please correct your code (prev always point to the tail in your answer), you must add a new pointer largest_prev and you set it to prev in case of : if(curr->num > largest->num), then use it instead of prev (largest_prev->next = list)

          – TOC
          Aug 5 '12 at 14:52











        • @TOC : ty, done. more lisible code would be to use a function that search for largest element and a function that switch nodes.

          – Hicham from CppDepend Team
          Aug 6 '12 at 6:54











        • This algorithm does not work when you have a list like this: 524361

          – user1511417
          Feb 3 '15 at 20:12
















        1














        There is issues in the sortList function.



        This function only put some large nodes in the beginning of the list. It is not soting all the list. you can you a sort algorithm to sort the file : quicksort/ bubblesort/...
        i put a code doing a sort in the end of this answer.



        here is a code doing the sort of the list :



        //it is replacing largest node with first one then doing the same operation with sublist (list-first element)



        NodePtr sortList(NodePtr list) 
        {

        //
        if(list == null || list->next == null)
        return list; // the list is sorted.

        //replace largest node with the first :

        //1- find largest node :
        NodePtr curr, largest,largestPrev;
        curr = list;
        largest = list;
        prev = list;
        largestPrev = list;
        while(curr != NULL) {
        if(curr->num > largest->num) {
        largestPrev = prev;
        largest = curr;
        }
        prev = curr;
        curr = curr->next;

        }
        //largest node is in largest.

        //2- switching firt node and largest node :
        NodePtr tmp;
        if(largest != list)
        {
        largestPrev->next = list;
        tmp = list->next;
        list->next = largest->next;
        largest->next = tmp;
        }

        // now largest is the first node of the list.

        // calling the function again with the sub list :
        // list minus its first node :
        largest->next = sortList(largest->next);


        return largest;
        }





        share|improve this answer





















        • 1





          Please correct your code (prev always point to the tail in your answer), you must add a new pointer largest_prev and you set it to prev in case of : if(curr->num > largest->num), then use it instead of prev (largest_prev->next = list)

          – TOC
          Aug 5 '12 at 14:52











        • @TOC : ty, done. more lisible code would be to use a function that search for largest element and a function that switch nodes.

          – Hicham from CppDepend Team
          Aug 6 '12 at 6:54











        • This algorithm does not work when you have a list like this: 524361

          – user1511417
          Feb 3 '15 at 20:12














        1












        1








        1







        There is issues in the sortList function.



        This function only put some large nodes in the beginning of the list. It is not soting all the list. you can you a sort algorithm to sort the file : quicksort/ bubblesort/...
        i put a code doing a sort in the end of this answer.



        here is a code doing the sort of the list :



        //it is replacing largest node with first one then doing the same operation with sublist (list-first element)



        NodePtr sortList(NodePtr list) 
        {

        //
        if(list == null || list->next == null)
        return list; // the list is sorted.

        //replace largest node with the first :

        //1- find largest node :
        NodePtr curr, largest,largestPrev;
        curr = list;
        largest = list;
        prev = list;
        largestPrev = list;
        while(curr != NULL) {
        if(curr->num > largest->num) {
        largestPrev = prev;
        largest = curr;
        }
        prev = curr;
        curr = curr->next;

        }
        //largest node is in largest.

        //2- switching firt node and largest node :
        NodePtr tmp;
        if(largest != list)
        {
        largestPrev->next = list;
        tmp = list->next;
        list->next = largest->next;
        largest->next = tmp;
        }

        // now largest is the first node of the list.

        // calling the function again with the sub list :
        // list minus its first node :
        largest->next = sortList(largest->next);


        return largest;
        }





        share|improve this answer















        There is issues in the sortList function.



        This function only put some large nodes in the beginning of the list. It is not soting all the list. you can you a sort algorithm to sort the file : quicksort/ bubblesort/...
        i put a code doing a sort in the end of this answer.



        here is a code doing the sort of the list :



        //it is replacing largest node with first one then doing the same operation with sublist (list-first element)



        NodePtr sortList(NodePtr list) 
        {

        //
        if(list == null || list->next == null)
        return list; // the list is sorted.

        //replace largest node with the first :

        //1- find largest node :
        NodePtr curr, largest,largestPrev;
        curr = list;
        largest = list;
        prev = list;
        largestPrev = list;
        while(curr != NULL) {
        if(curr->num > largest->num) {
        largestPrev = prev;
        largest = curr;
        }
        prev = curr;
        curr = curr->next;

        }
        //largest node is in largest.

        //2- switching firt node and largest node :
        NodePtr tmp;
        if(largest != list)
        {
        largestPrev->next = list;
        tmp = list->next;
        list->next = largest->next;
        largest->next = tmp;
        }

        // now largest is the first node of the list.

        // calling the function again with the sub list :
        // list minus its first node :
        largest->next = sortList(largest->next);


        return largest;
        }






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Aug 6 '12 at 6:52

























        answered Aug 5 '12 at 10:28









        Hicham from CppDepend TeamHicham from CppDepend Team

        865616




        865616








        • 1





          Please correct your code (prev always point to the tail in your answer), you must add a new pointer largest_prev and you set it to prev in case of : if(curr->num > largest->num), then use it instead of prev (largest_prev->next = list)

          – TOC
          Aug 5 '12 at 14:52











        • @TOC : ty, done. more lisible code would be to use a function that search for largest element and a function that switch nodes.

          – Hicham from CppDepend Team
          Aug 6 '12 at 6:54











        • This algorithm does not work when you have a list like this: 524361

          – user1511417
          Feb 3 '15 at 20:12














        • 1





          Please correct your code (prev always point to the tail in your answer), you must add a new pointer largest_prev and you set it to prev in case of : if(curr->num > largest->num), then use it instead of prev (largest_prev->next = list)

          – TOC
          Aug 5 '12 at 14:52











        • @TOC : ty, done. more lisible code would be to use a function that search for largest element and a function that switch nodes.

          – Hicham from CppDepend Team
          Aug 6 '12 at 6:54











        • This algorithm does not work when you have a list like this: 524361

          – user1511417
          Feb 3 '15 at 20:12








        1




        1





        Please correct your code (prev always point to the tail in your answer), you must add a new pointer largest_prev and you set it to prev in case of : if(curr->num > largest->num), then use it instead of prev (largest_prev->next = list)

        – TOC
        Aug 5 '12 at 14:52





        Please correct your code (prev always point to the tail in your answer), you must add a new pointer largest_prev and you set it to prev in case of : if(curr->num > largest->num), then use it instead of prev (largest_prev->next = list)

        – TOC
        Aug 5 '12 at 14:52













        @TOC : ty, done. more lisible code would be to use a function that search for largest element and a function that switch nodes.

        – Hicham from CppDepend Team
        Aug 6 '12 at 6:54





        @TOC : ty, done. more lisible code would be to use a function that search for largest element and a function that switch nodes.

        – Hicham from CppDepend Team
        Aug 6 '12 at 6:54













        This algorithm does not work when you have a list like this: 524361

        – user1511417
        Feb 3 '15 at 20:12





        This algorithm does not work when you have a list like this: 524361

        – user1511417
        Feb 3 '15 at 20:12













        1














        Here is my attempt to sort a singly linked list using QuickSort algorithm. If you know n then run time will be O(n log n). Check if this helps.



        #include "malloc.h"

        typedef struct node {
        struct node *next;
        int val;
        } node;

        bool insert_node(struct node **head, int val)
        {
        struct node *elem;
        elem = (struct node *)malloc(sizeof(struct node));
        if (!elem)
        return false;
        elem->val = val;
        elem->next = *head;
        *head = elem;
        return true;
        }

        int get_lval(struct node *head, int l)
        {
        while(head && l) {
        head = head->next;
        l--;
        }
        if (head != NULL)
        return head->val;
        else
        return -1;
        }

        void swap(struct node *head, int i, int j)
        {
        struct node *tmp = head;
        int tmpival;
        int tmpjval;
        int ti = i;
        while(tmp && i) {
        i--;
        tmp = tmp->next;
        }
        tmpival = tmp->val;
        tmp = head;
        while(tmp && j) {
        j--;
        tmp = tmp->next;
        }
        tmpjval = tmp->val;
        tmp->val = tmpival;
        tmp = head;
        i = ti;
        while(tmp && i) {
        i--;
        tmp = tmp->next;
        }
        tmp->val = tmpjval;
        }


        struct node *Quick_Sort_List(struct node *head, int l, int r)
        {
        int i, j;
        int jval;
        int pivot;
        i = l + 1;
        if (l + 1 < r) {
        pivot = get_lval(head, l);
        printf("Pivot = %dn", pivot);
        for (j = l + 1; j <= r; j++) {
        jval = get_lval(head, j);
        if (jval < pivot && jval != -1) {
        swap(head, i, j);
        i++;
        }
        }
        swap(head, i - 1, l);
        Quick_Sort_List(head, l, i);
        Quick_Sort_List(head, i, r);
        }
        return head;
        }

        struct node *Sort_linkedlist(struct node *head)
        {
        struct node *tmp = head;
        // Using Quick sort.
        int n = 0;

        while (tmp) {
        n++;
        tmp = tmp->next;
        }
        printf("n = %dn", n);
        head = Quick_Sort_List(head, 0, n);
        return head;
        }

        void print_list(struct node *head)
        {
        while(head) {
        printf("%d->", head->val);
        head = head->next;
        }
        printf("n");
        }

        int _tmain(int argc, _TCHAR* argv)
        {
        struct node *head = NULL;
        struct node *shead = NULL;

        insert_node(&head, 10);
        insert_node(&head, 12);
        insert_node(&head, 9);
        insert_node(&head, 11);
        insert_node(&head, 7);
        insert_node(&head, 1);
        insert_node(&head, 3);
        insert_node(&head, 8);
        insert_node(&head, 5);
        insert_node(&head, 2);
        insert_node(&head, 4);
        insert_node(&head, 6);
        print_list(head);

        shead = Sort_linkedlist(head);
        print_list(shead);

        return 0;
        }





        share|improve this answer




























          1














          Here is my attempt to sort a singly linked list using QuickSort algorithm. If you know n then run time will be O(n log n). Check if this helps.



          #include "malloc.h"

          typedef struct node {
          struct node *next;
          int val;
          } node;

          bool insert_node(struct node **head, int val)
          {
          struct node *elem;
          elem = (struct node *)malloc(sizeof(struct node));
          if (!elem)
          return false;
          elem->val = val;
          elem->next = *head;
          *head = elem;
          return true;
          }

          int get_lval(struct node *head, int l)
          {
          while(head && l) {
          head = head->next;
          l--;
          }
          if (head != NULL)
          return head->val;
          else
          return -1;
          }

          void swap(struct node *head, int i, int j)
          {
          struct node *tmp = head;
          int tmpival;
          int tmpjval;
          int ti = i;
          while(tmp && i) {
          i--;
          tmp = tmp->next;
          }
          tmpival = tmp->val;
          tmp = head;
          while(tmp && j) {
          j--;
          tmp = tmp->next;
          }
          tmpjval = tmp->val;
          tmp->val = tmpival;
          tmp = head;
          i = ti;
          while(tmp && i) {
          i--;
          tmp = tmp->next;
          }
          tmp->val = tmpjval;
          }


          struct node *Quick_Sort_List(struct node *head, int l, int r)
          {
          int i, j;
          int jval;
          int pivot;
          i = l + 1;
          if (l + 1 < r) {
          pivot = get_lval(head, l);
          printf("Pivot = %dn", pivot);
          for (j = l + 1; j <= r; j++) {
          jval = get_lval(head, j);
          if (jval < pivot && jval != -1) {
          swap(head, i, j);
          i++;
          }
          }
          swap(head, i - 1, l);
          Quick_Sort_List(head, l, i);
          Quick_Sort_List(head, i, r);
          }
          return head;
          }

          struct node *Sort_linkedlist(struct node *head)
          {
          struct node *tmp = head;
          // Using Quick sort.
          int n = 0;

          while (tmp) {
          n++;
          tmp = tmp->next;
          }
          printf("n = %dn", n);
          head = Quick_Sort_List(head, 0, n);
          return head;
          }

          void print_list(struct node *head)
          {
          while(head) {
          printf("%d->", head->val);
          head = head->next;
          }
          printf("n");
          }

          int _tmain(int argc, _TCHAR* argv)
          {
          struct node *head = NULL;
          struct node *shead = NULL;

          insert_node(&head, 10);
          insert_node(&head, 12);
          insert_node(&head, 9);
          insert_node(&head, 11);
          insert_node(&head, 7);
          insert_node(&head, 1);
          insert_node(&head, 3);
          insert_node(&head, 8);
          insert_node(&head, 5);
          insert_node(&head, 2);
          insert_node(&head, 4);
          insert_node(&head, 6);
          print_list(head);

          shead = Sort_linkedlist(head);
          print_list(shead);

          return 0;
          }





          share|improve this answer


























            1












            1








            1







            Here is my attempt to sort a singly linked list using QuickSort algorithm. If you know n then run time will be O(n log n). Check if this helps.



            #include "malloc.h"

            typedef struct node {
            struct node *next;
            int val;
            } node;

            bool insert_node(struct node **head, int val)
            {
            struct node *elem;
            elem = (struct node *)malloc(sizeof(struct node));
            if (!elem)
            return false;
            elem->val = val;
            elem->next = *head;
            *head = elem;
            return true;
            }

            int get_lval(struct node *head, int l)
            {
            while(head && l) {
            head = head->next;
            l--;
            }
            if (head != NULL)
            return head->val;
            else
            return -1;
            }

            void swap(struct node *head, int i, int j)
            {
            struct node *tmp = head;
            int tmpival;
            int tmpjval;
            int ti = i;
            while(tmp && i) {
            i--;
            tmp = tmp->next;
            }
            tmpival = tmp->val;
            tmp = head;
            while(tmp && j) {
            j--;
            tmp = tmp->next;
            }
            tmpjval = tmp->val;
            tmp->val = tmpival;
            tmp = head;
            i = ti;
            while(tmp && i) {
            i--;
            tmp = tmp->next;
            }
            tmp->val = tmpjval;
            }


            struct node *Quick_Sort_List(struct node *head, int l, int r)
            {
            int i, j;
            int jval;
            int pivot;
            i = l + 1;
            if (l + 1 < r) {
            pivot = get_lval(head, l);
            printf("Pivot = %dn", pivot);
            for (j = l + 1; j <= r; j++) {
            jval = get_lval(head, j);
            if (jval < pivot && jval != -1) {
            swap(head, i, j);
            i++;
            }
            }
            swap(head, i - 1, l);
            Quick_Sort_List(head, l, i);
            Quick_Sort_List(head, i, r);
            }
            return head;
            }

            struct node *Sort_linkedlist(struct node *head)
            {
            struct node *tmp = head;
            // Using Quick sort.
            int n = 0;

            while (tmp) {
            n++;
            tmp = tmp->next;
            }
            printf("n = %dn", n);
            head = Quick_Sort_List(head, 0, n);
            return head;
            }

            void print_list(struct node *head)
            {
            while(head) {
            printf("%d->", head->val);
            head = head->next;
            }
            printf("n");
            }

            int _tmain(int argc, _TCHAR* argv)
            {
            struct node *head = NULL;
            struct node *shead = NULL;

            insert_node(&head, 10);
            insert_node(&head, 12);
            insert_node(&head, 9);
            insert_node(&head, 11);
            insert_node(&head, 7);
            insert_node(&head, 1);
            insert_node(&head, 3);
            insert_node(&head, 8);
            insert_node(&head, 5);
            insert_node(&head, 2);
            insert_node(&head, 4);
            insert_node(&head, 6);
            print_list(head);

            shead = Sort_linkedlist(head);
            print_list(shead);

            return 0;
            }





            share|improve this answer













            Here is my attempt to sort a singly linked list using QuickSort algorithm. If you know n then run time will be O(n log n). Check if this helps.



            #include "malloc.h"

            typedef struct node {
            struct node *next;
            int val;
            } node;

            bool insert_node(struct node **head, int val)
            {
            struct node *elem;
            elem = (struct node *)malloc(sizeof(struct node));
            if (!elem)
            return false;
            elem->val = val;
            elem->next = *head;
            *head = elem;
            return true;
            }

            int get_lval(struct node *head, int l)
            {
            while(head && l) {
            head = head->next;
            l--;
            }
            if (head != NULL)
            return head->val;
            else
            return -1;
            }

            void swap(struct node *head, int i, int j)
            {
            struct node *tmp = head;
            int tmpival;
            int tmpjval;
            int ti = i;
            while(tmp && i) {
            i--;
            tmp = tmp->next;
            }
            tmpival = tmp->val;
            tmp = head;
            while(tmp && j) {
            j--;
            tmp = tmp->next;
            }
            tmpjval = tmp->val;
            tmp->val = tmpival;
            tmp = head;
            i = ti;
            while(tmp && i) {
            i--;
            tmp = tmp->next;
            }
            tmp->val = tmpjval;
            }


            struct node *Quick_Sort_List(struct node *head, int l, int r)
            {
            int i, j;
            int jval;
            int pivot;
            i = l + 1;
            if (l + 1 < r) {
            pivot = get_lval(head, l);
            printf("Pivot = %dn", pivot);
            for (j = l + 1; j <= r; j++) {
            jval = get_lval(head, j);
            if (jval < pivot && jval != -1) {
            swap(head, i, j);
            i++;
            }
            }
            swap(head, i - 1, l);
            Quick_Sort_List(head, l, i);
            Quick_Sort_List(head, i, r);
            }
            return head;
            }

            struct node *Sort_linkedlist(struct node *head)
            {
            struct node *tmp = head;
            // Using Quick sort.
            int n = 0;

            while (tmp) {
            n++;
            tmp = tmp->next;
            }
            printf("n = %dn", n);
            head = Quick_Sort_List(head, 0, n);
            return head;
            }

            void print_list(struct node *head)
            {
            while(head) {
            printf("%d->", head->val);
            head = head->next;
            }
            printf("n");
            }

            int _tmain(int argc, _TCHAR* argv)
            {
            struct node *head = NULL;
            struct node *shead = NULL;

            insert_node(&head, 10);
            insert_node(&head, 12);
            insert_node(&head, 9);
            insert_node(&head, 11);
            insert_node(&head, 7);
            insert_node(&head, 1);
            insert_node(&head, 3);
            insert_node(&head, 8);
            insert_node(&head, 5);
            insert_node(&head, 2);
            insert_node(&head, 4);
            insert_node(&head, 6);
            print_list(head);

            shead = Sort_linkedlist(head);
            print_list(shead);

            return 0;
            }






            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Mar 17 '13 at 3:41









            user1596193user1596193

            1023




            1023























                0














                This should really help you. It's a very nice post.






                share|improve this answer
























                • Answers on Stack Overflow should generally stand on their own (although citations are great). If you'd like to share a link, you can do that in a comment.

                  – Dietrich Epp
                  Aug 5 '12 at 3:44













                • Lesson learnt. Will do.

                  – Prasanth
                  Aug 5 '12 at 3:46
















                0














                This should really help you. It's a very nice post.






                share|improve this answer
























                • Answers on Stack Overflow should generally stand on their own (although citations are great). If you'd like to share a link, you can do that in a comment.

                  – Dietrich Epp
                  Aug 5 '12 at 3:44













                • Lesson learnt. Will do.

                  – Prasanth
                  Aug 5 '12 at 3:46














                0












                0








                0







                This should really help you. It's a very nice post.






                share|improve this answer













                This should really help you. It's a very nice post.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Aug 5 '12 at 3:29









                PrasanthPrasanth

                5,47322049




                5,47322049













                • Answers on Stack Overflow should generally stand on their own (although citations are great). If you'd like to share a link, you can do that in a comment.

                  – Dietrich Epp
                  Aug 5 '12 at 3:44













                • Lesson learnt. Will do.

                  – Prasanth
                  Aug 5 '12 at 3:46



















                • Answers on Stack Overflow should generally stand on their own (although citations are great). If you'd like to share a link, you can do that in a comment.

                  – Dietrich Epp
                  Aug 5 '12 at 3:44













                • Lesson learnt. Will do.

                  – Prasanth
                  Aug 5 '12 at 3:46

















                Answers on Stack Overflow should generally stand on their own (although citations are great). If you'd like to share a link, you can do that in a comment.

                – Dietrich Epp
                Aug 5 '12 at 3:44







                Answers on Stack Overflow should generally stand on their own (although citations are great). If you'd like to share a link, you can do that in a comment.

                – Dietrich Epp
                Aug 5 '12 at 3:44















                Lesson learnt. Will do.

                – Prasanth
                Aug 5 '12 at 3:46





                Lesson learnt. Will do.

                – Prasanth
                Aug 5 '12 at 3:46











                0














                By writing to largest->next you overwrote curr->next. So you end up restarting from the top all the time.



                Make sure that:




                1. the list remains consistent

                2. your list iterator remains consistent


                But overall, your code seems to be heavily broken, I believe there might be a couple other errors in your sorting logic.






                share|improve this answer




























                  0














                  By writing to largest->next you overwrote curr->next. So you end up restarting from the top all the time.



                  Make sure that:




                  1. the list remains consistent

                  2. your list iterator remains consistent


                  But overall, your code seems to be heavily broken, I believe there might be a couple other errors in your sorting logic.






                  share|improve this answer


























                    0












                    0








                    0







                    By writing to largest->next you overwrote curr->next. So you end up restarting from the top all the time.



                    Make sure that:




                    1. the list remains consistent

                    2. your list iterator remains consistent


                    But overall, your code seems to be heavily broken, I believe there might be a couple other errors in your sorting logic.






                    share|improve this answer













                    By writing to largest->next you overwrote curr->next. So you end up restarting from the top all the time.



                    Make sure that:




                    1. the list remains consistent

                    2. your list iterator remains consistent


                    But overall, your code seems to be heavily broken, I believe there might be a couple other errors in your sorting logic.







                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Aug 5 '12 at 3:31









                    Anony-MousseAnony-Mousse

                    58.2k797161




                    58.2k797161























                        0














                        The following are some of the problems which exist in your sorting logic:




                        1. You are setting the prev pointer to curr in the beginning of the loop itself which is incorrect. By doing this, you are making the current pointer and the previous node pointer as same which makes it impossible to delete the node.

                        2. You should assign the largest pointer also to top whereby it facilitates the possibility of setting the largest->next to real top node.


                        The code can modified like below (Just a pointer, you need to check for other issues yourself):



                        while(curr != NULL)
                        {

                        if(curr->num > largest->num)
                        {
                        largest = curr;
                        prev->next = curr->next;
                        largest->next = top;
                        top = largest;

                        }
                        prev = curr;
                        curr = curr->next;
                        }





                        share|improve this answer
























                        • there still a pointer issue, curr will be top all the time : larger is pointing to the same node as curr. you put largest->next to top then curr->next points to top. when you write curr = curr->next, you actually put top in curr (because you have written top in largest (largest = curr in this point)). so you retart infinitly from top.

                          – Hicham from CppDepend Team
                          Aug 5 '12 at 10:33
















                        0














                        The following are some of the problems which exist in your sorting logic:




                        1. You are setting the prev pointer to curr in the beginning of the loop itself which is incorrect. By doing this, you are making the current pointer and the previous node pointer as same which makes it impossible to delete the node.

                        2. You should assign the largest pointer also to top whereby it facilitates the possibility of setting the largest->next to real top node.


                        The code can modified like below (Just a pointer, you need to check for other issues yourself):



                        while(curr != NULL)
                        {

                        if(curr->num > largest->num)
                        {
                        largest = curr;
                        prev->next = curr->next;
                        largest->next = top;
                        top = largest;

                        }
                        prev = curr;
                        curr = curr->next;
                        }





                        share|improve this answer
























                        • there still a pointer issue, curr will be top all the time : larger is pointing to the same node as curr. you put largest->next to top then curr->next points to top. when you write curr = curr->next, you actually put top in curr (because you have written top in largest (largest = curr in this point)). so you retart infinitly from top.

                          – Hicham from CppDepend Team
                          Aug 5 '12 at 10:33














                        0












                        0








                        0







                        The following are some of the problems which exist in your sorting logic:




                        1. You are setting the prev pointer to curr in the beginning of the loop itself which is incorrect. By doing this, you are making the current pointer and the previous node pointer as same which makes it impossible to delete the node.

                        2. You should assign the largest pointer also to top whereby it facilitates the possibility of setting the largest->next to real top node.


                        The code can modified like below (Just a pointer, you need to check for other issues yourself):



                        while(curr != NULL)
                        {

                        if(curr->num > largest->num)
                        {
                        largest = curr;
                        prev->next = curr->next;
                        largest->next = top;
                        top = largest;

                        }
                        prev = curr;
                        curr = curr->next;
                        }





                        share|improve this answer













                        The following are some of the problems which exist in your sorting logic:




                        1. You are setting the prev pointer to curr in the beginning of the loop itself which is incorrect. By doing this, you are making the current pointer and the previous node pointer as same which makes it impossible to delete the node.

                        2. You should assign the largest pointer also to top whereby it facilitates the possibility of setting the largest->next to real top node.


                        The code can modified like below (Just a pointer, you need to check for other issues yourself):



                        while(curr != NULL)
                        {

                        if(curr->num > largest->num)
                        {
                        largest = curr;
                        prev->next = curr->next;
                        largest->next = top;
                        top = largest;

                        }
                        prev = curr;
                        curr = curr->next;
                        }






                        share|improve this answer












                        share|improve this answer



                        share|improve this answer










                        answered Aug 5 '12 at 4:21









                        JayJay

                        15.1k2163121




                        15.1k2163121













                        • there still a pointer issue, curr will be top all the time : larger is pointing to the same node as curr. you put largest->next to top then curr->next points to top. when you write curr = curr->next, you actually put top in curr (because you have written top in largest (largest = curr in this point)). so you retart infinitly from top.

                          – Hicham from CppDepend Team
                          Aug 5 '12 at 10:33



















                        • there still a pointer issue, curr will be top all the time : larger is pointing to the same node as curr. you put largest->next to top then curr->next points to top. when you write curr = curr->next, you actually put top in curr (because you have written top in largest (largest = curr in this point)). so you retart infinitly from top.

                          – Hicham from CppDepend Team
                          Aug 5 '12 at 10:33

















                        there still a pointer issue, curr will be top all the time : larger is pointing to the same node as curr. you put largest->next to top then curr->next points to top. when you write curr = curr->next, you actually put top in curr (because you have written top in largest (largest = curr in this point)). so you retart infinitly from top.

                        – Hicham from CppDepend Team
                        Aug 5 '12 at 10:33





                        there still a pointer issue, curr will be top all the time : larger is pointing to the same node as curr. you put largest->next to top then curr->next points to top. when you write curr = curr->next, you actually put top in curr (because you have written top in largest (largest = curr in this point)). so you retart infinitly from top.

                        – Hicham from CppDepend Team
                        Aug 5 '12 at 10:33











                        0














                        // Program to sort a single linked list in ascending order
                        // (without exchanging data in the nodes)
                        /**************************************************************************

                        There are two methods of sorting presented here(At a time,we can use any of
                        these two functions to sort our single linked list.) -

                        1. Function 'void Sort()' - This function uses selection sort method(I
                        think).
                        In this function,a node whose data is the smallest in the list is made
                        as 'head' node(i.e. starting node of the list) by scanning the whole list
                        once.Then from the remaining list,again a node with the smallest data is
                        found out whose address is kept in the 'next' field of previous node(head
                        node).This process continues to sort the whole list.
                        2. Function 'void Sort_method2()' - This function uses insertion sort
                        method(I think).
                        In this function,starting from second node in the list, all previous node
                        data(starting from 'head' node) are compared with current reference node
                        (which is initially second node in the list).If 'data' field of current
                        reference node is smaller than that of any of its previous nodes,then
                        suitable changes in the 'next' field of corresponding nodes are made.If
                        data in the current reference node is smaller than that in the 'head' node,
                        then the current reference node is made as 'head' node.

                        *********************************************************************/

                        #include<stdio.h>
                        #include<conio.h>
                        #include<alloc.h>
                        #include<stdlib.h>

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

                        struct node *head,*head1;

                        void Create_node(int data);
                        void display();
                        void Sort();
                        void Sort_method2();


                        void main()
                        {
                        int choice,d;
                        clrscr();
                        while(1)
                        {
                        printf("n 1.Create new node");
                        printf("n 2.Sort in ascending order");
                        printf("n 3.Exit");
                        printf("nEnter your choice : ");
                        scanf("%d",&choice);

                        switch(choice)
                        {
                        case 1: printf("nEnter data :");
                        scanf("%d",&d);
                        Create_node(d);
                        break;
                        case 2: Sort(); // At a time,we can use any of these two
                        //Sort_method2(); // functions to sort our single linked list.
                        break;
                        case 3: exit(0);
                        default:exit(0);
                        }
                        } // end of while(1)
                        } // end of main()

                        //--------------------------------------------
                        void Create_node(int d)
                        {
                        struct node *newnode,*temp;
                        newnode = (struct node *)malloc(sizeof(struct node));
                        newnode -> data = d;
                        newnode -> next = NULL;
                        if(head == NULL)
                        head = newnode;
                        else
                        {
                        temp = head;
                        while(temp -> next != NULL)
                        temp = temp -> next;

                        temp -> next = newnode;
                        } // end of 'else'
                        } // end of 'Create_node(int d)'

                        //---------------------------------------------
                        void display() // Print linked list contents
                        {
                        struct node *temp;
                        printf("nList contents are :n");
                        temp = head;
                        while(temp != NULL)
                        {
                        printf(" Data = %d Address = %un",temp->data,temp);
                        temp = temp->next;
                        }
                        printf("n");
                        }
                        //--------------------------------------------
                        void Sort()
                        {
                        struct node *t,*t1,*t2,*t3;
                        t1 = head;
                        head1 = head;
                        if(head == NULL)
                        printf("nThe linked list is empty!");
                        else
                        {
                        while( (t2 = t1 -> next) != NULL)
                        {
                        while(t2 != NULL)
                        {
                        t3 = t2 -> next;
                        if( t1 -> data > t2 -> data)
                        {
                        t2 -> next = t1;
                        for(t = t1; t -> next != t2;t = t -> next);

                        t -> next = t3;
                        t1 = t2; // t1 = Node with smaller data
                        t2 = t3; // t2 = Node to be compared with t1
                        } // end of 'if'
                        else
                        {
                        // t1 = t1; // That is,no change in t1.
                        t2 = t3;
                        }
                        } // end of ' while(t2 != NULL)'

                        if(head == head1) // We want this action only for first pass of
                        { // outer while() loop.Only initially, head = head1.
                        head = t1;
                        head1 = t1 -> next;
                        } // end of 'if(head == head1)'
                        else
                        {
                        for(t = head;t -> next != head1; t = t -> next);

                        t -> next = t1;
                        head1 = t1 -> next;
                        } // end of 'else'

                        t1 = t1 -> next;
                        } // end of 'while( (t2 = t1 -> next) != NULL)'

                        display(); // Display the list.
                        } // end of 'else' of 'if(head == NULL)'
                        } // end of 'Sort()'

                        //--------------------------------------------
                        void Sort_method2()
                        {
                        struct node *t,*t1,*t2,*tt;
                        if(head == NULL)
                        printf("nThe linked list is empty!");
                        else
                        {
                        t1 = head -> next;
                        while(t1 != NULL) // This is i-loop(outer loop).
                        {
                        t2 = t1 -> next;
                        for(t = head; t != t1; t = t -> next) // This is j-loop(inner loop).
                        {
                        if(t1->data < t->data)
                        {
                        t1 -> next = t;
                        for(tt=head; tt->next != t1; tt=tt->next); //end of for loop in 'if'

                        tt -> next = t2;
                        if(t == head)
                        head = t1; // There is only one statement in this 'if'.
                        else // i.e.,'if(t != head)'
                        {
                        for(tt=head; tt->next != t; tt=tt->next);

                        tt -> next = t1;
                        }
                        break;
                        } // end of 'if'
                        } // end of outer 'for' loop
                        t1 = t2;
                        } // end of 'while'

                        display(); // Display the list.
                        } // end of 'else' of 'if(head == NULL)'
                        } // end of 'Sort_method2()'





                        share|improve this answer






























                          0














                          // Program to sort a single linked list in ascending order
                          // (without exchanging data in the nodes)
                          /**************************************************************************

                          There are two methods of sorting presented here(At a time,we can use any of
                          these two functions to sort our single linked list.) -

                          1. Function 'void Sort()' - This function uses selection sort method(I
                          think).
                          In this function,a node whose data is the smallest in the list is made
                          as 'head' node(i.e. starting node of the list) by scanning the whole list
                          once.Then from the remaining list,again a node with the smallest data is
                          found out whose address is kept in the 'next' field of previous node(head
                          node).This process continues to sort the whole list.
                          2. Function 'void Sort_method2()' - This function uses insertion sort
                          method(I think).
                          In this function,starting from second node in the list, all previous node
                          data(starting from 'head' node) are compared with current reference node
                          (which is initially second node in the list).If 'data' field of current
                          reference node is smaller than that of any of its previous nodes,then
                          suitable changes in the 'next' field of corresponding nodes are made.If
                          data in the current reference node is smaller than that in the 'head' node,
                          then the current reference node is made as 'head' node.

                          *********************************************************************/

                          #include<stdio.h>
                          #include<conio.h>
                          #include<alloc.h>
                          #include<stdlib.h>

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

                          struct node *head,*head1;

                          void Create_node(int data);
                          void display();
                          void Sort();
                          void Sort_method2();


                          void main()
                          {
                          int choice,d;
                          clrscr();
                          while(1)
                          {
                          printf("n 1.Create new node");
                          printf("n 2.Sort in ascending order");
                          printf("n 3.Exit");
                          printf("nEnter your choice : ");
                          scanf("%d",&choice);

                          switch(choice)
                          {
                          case 1: printf("nEnter data :");
                          scanf("%d",&d);
                          Create_node(d);
                          break;
                          case 2: Sort(); // At a time,we can use any of these two
                          //Sort_method2(); // functions to sort our single linked list.
                          break;
                          case 3: exit(0);
                          default:exit(0);
                          }
                          } // end of while(1)
                          } // end of main()

                          //--------------------------------------------
                          void Create_node(int d)
                          {
                          struct node *newnode,*temp;
                          newnode = (struct node *)malloc(sizeof(struct node));
                          newnode -> data = d;
                          newnode -> next = NULL;
                          if(head == NULL)
                          head = newnode;
                          else
                          {
                          temp = head;
                          while(temp -> next != NULL)
                          temp = temp -> next;

                          temp -> next = newnode;
                          } // end of 'else'
                          } // end of 'Create_node(int d)'

                          //---------------------------------------------
                          void display() // Print linked list contents
                          {
                          struct node *temp;
                          printf("nList contents are :n");
                          temp = head;
                          while(temp != NULL)
                          {
                          printf(" Data = %d Address = %un",temp->data,temp);
                          temp = temp->next;
                          }
                          printf("n");
                          }
                          //--------------------------------------------
                          void Sort()
                          {
                          struct node *t,*t1,*t2,*t3;
                          t1 = head;
                          head1 = head;
                          if(head == NULL)
                          printf("nThe linked list is empty!");
                          else
                          {
                          while( (t2 = t1 -> next) != NULL)
                          {
                          while(t2 != NULL)
                          {
                          t3 = t2 -> next;
                          if( t1 -> data > t2 -> data)
                          {
                          t2 -> next = t1;
                          for(t = t1; t -> next != t2;t = t -> next);

                          t -> next = t3;
                          t1 = t2; // t1 = Node with smaller data
                          t2 = t3; // t2 = Node to be compared with t1
                          } // end of 'if'
                          else
                          {
                          // t1 = t1; // That is,no change in t1.
                          t2 = t3;
                          }
                          } // end of ' while(t2 != NULL)'

                          if(head == head1) // We want this action only for first pass of
                          { // outer while() loop.Only initially, head = head1.
                          head = t1;
                          head1 = t1 -> next;
                          } // end of 'if(head == head1)'
                          else
                          {
                          for(t = head;t -> next != head1; t = t -> next);

                          t -> next = t1;
                          head1 = t1 -> next;
                          } // end of 'else'

                          t1 = t1 -> next;
                          } // end of 'while( (t2 = t1 -> next) != NULL)'

                          display(); // Display the list.
                          } // end of 'else' of 'if(head == NULL)'
                          } // end of 'Sort()'

                          //--------------------------------------------
                          void Sort_method2()
                          {
                          struct node *t,*t1,*t2,*tt;
                          if(head == NULL)
                          printf("nThe linked list is empty!");
                          else
                          {
                          t1 = head -> next;
                          while(t1 != NULL) // This is i-loop(outer loop).
                          {
                          t2 = t1 -> next;
                          for(t = head; t != t1; t = t -> next) // This is j-loop(inner loop).
                          {
                          if(t1->data < t->data)
                          {
                          t1 -> next = t;
                          for(tt=head; tt->next != t1; tt=tt->next); //end of for loop in 'if'

                          tt -> next = t2;
                          if(t == head)
                          head = t1; // There is only one statement in this 'if'.
                          else // i.e.,'if(t != head)'
                          {
                          for(tt=head; tt->next != t; tt=tt->next);

                          tt -> next = t1;
                          }
                          break;
                          } // end of 'if'
                          } // end of outer 'for' loop
                          t1 = t2;
                          } // end of 'while'

                          display(); // Display the list.
                          } // end of 'else' of 'if(head == NULL)'
                          } // end of 'Sort_method2()'





                          share|improve this answer




























                            0












                            0








                            0







                            // Program to sort a single linked list in ascending order
                            // (without exchanging data in the nodes)
                            /**************************************************************************

                            There are two methods of sorting presented here(At a time,we can use any of
                            these two functions to sort our single linked list.) -

                            1. Function 'void Sort()' - This function uses selection sort method(I
                            think).
                            In this function,a node whose data is the smallest in the list is made
                            as 'head' node(i.e. starting node of the list) by scanning the whole list
                            once.Then from the remaining list,again a node with the smallest data is
                            found out whose address is kept in the 'next' field of previous node(head
                            node).This process continues to sort the whole list.
                            2. Function 'void Sort_method2()' - This function uses insertion sort
                            method(I think).
                            In this function,starting from second node in the list, all previous node
                            data(starting from 'head' node) are compared with current reference node
                            (which is initially second node in the list).If 'data' field of current
                            reference node is smaller than that of any of its previous nodes,then
                            suitable changes in the 'next' field of corresponding nodes are made.If
                            data in the current reference node is smaller than that in the 'head' node,
                            then the current reference node is made as 'head' node.

                            *********************************************************************/

                            #include<stdio.h>
                            #include<conio.h>
                            #include<alloc.h>
                            #include<stdlib.h>

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

                            struct node *head,*head1;

                            void Create_node(int data);
                            void display();
                            void Sort();
                            void Sort_method2();


                            void main()
                            {
                            int choice,d;
                            clrscr();
                            while(1)
                            {
                            printf("n 1.Create new node");
                            printf("n 2.Sort in ascending order");
                            printf("n 3.Exit");
                            printf("nEnter your choice : ");
                            scanf("%d",&choice);

                            switch(choice)
                            {
                            case 1: printf("nEnter data :");
                            scanf("%d",&d);
                            Create_node(d);
                            break;
                            case 2: Sort(); // At a time,we can use any of these two
                            //Sort_method2(); // functions to sort our single linked list.
                            break;
                            case 3: exit(0);
                            default:exit(0);
                            }
                            } // end of while(1)
                            } // end of main()

                            //--------------------------------------------
                            void Create_node(int d)
                            {
                            struct node *newnode,*temp;
                            newnode = (struct node *)malloc(sizeof(struct node));
                            newnode -> data = d;
                            newnode -> next = NULL;
                            if(head == NULL)
                            head = newnode;
                            else
                            {
                            temp = head;
                            while(temp -> next != NULL)
                            temp = temp -> next;

                            temp -> next = newnode;
                            } // end of 'else'
                            } // end of 'Create_node(int d)'

                            //---------------------------------------------
                            void display() // Print linked list contents
                            {
                            struct node *temp;
                            printf("nList contents are :n");
                            temp = head;
                            while(temp != NULL)
                            {
                            printf(" Data = %d Address = %un",temp->data,temp);
                            temp = temp->next;
                            }
                            printf("n");
                            }
                            //--------------------------------------------
                            void Sort()
                            {
                            struct node *t,*t1,*t2,*t3;
                            t1 = head;
                            head1 = head;
                            if(head == NULL)
                            printf("nThe linked list is empty!");
                            else
                            {
                            while( (t2 = t1 -> next) != NULL)
                            {
                            while(t2 != NULL)
                            {
                            t3 = t2 -> next;
                            if( t1 -> data > t2 -> data)
                            {
                            t2 -> next = t1;
                            for(t = t1; t -> next != t2;t = t -> next);

                            t -> next = t3;
                            t1 = t2; // t1 = Node with smaller data
                            t2 = t3; // t2 = Node to be compared with t1
                            } // end of 'if'
                            else
                            {
                            // t1 = t1; // That is,no change in t1.
                            t2 = t3;
                            }
                            } // end of ' while(t2 != NULL)'

                            if(head == head1) // We want this action only for first pass of
                            { // outer while() loop.Only initially, head = head1.
                            head = t1;
                            head1 = t1 -> next;
                            } // end of 'if(head == head1)'
                            else
                            {
                            for(t = head;t -> next != head1; t = t -> next);

                            t -> next = t1;
                            head1 = t1 -> next;
                            } // end of 'else'

                            t1 = t1 -> next;
                            } // end of 'while( (t2 = t1 -> next) != NULL)'

                            display(); // Display the list.
                            } // end of 'else' of 'if(head == NULL)'
                            } // end of 'Sort()'

                            //--------------------------------------------
                            void Sort_method2()
                            {
                            struct node *t,*t1,*t2,*tt;
                            if(head == NULL)
                            printf("nThe linked list is empty!");
                            else
                            {
                            t1 = head -> next;
                            while(t1 != NULL) // This is i-loop(outer loop).
                            {
                            t2 = t1 -> next;
                            for(t = head; t != t1; t = t -> next) // This is j-loop(inner loop).
                            {
                            if(t1->data < t->data)
                            {
                            t1 -> next = t;
                            for(tt=head; tt->next != t1; tt=tt->next); //end of for loop in 'if'

                            tt -> next = t2;
                            if(t == head)
                            head = t1; // There is only one statement in this 'if'.
                            else // i.e.,'if(t != head)'
                            {
                            for(tt=head; tt->next != t; tt=tt->next);

                            tt -> next = t1;
                            }
                            break;
                            } // end of 'if'
                            } // end of outer 'for' loop
                            t1 = t2;
                            } // end of 'while'

                            display(); // Display the list.
                            } // end of 'else' of 'if(head == NULL)'
                            } // end of 'Sort_method2()'





                            share|improve this answer















                            // Program to sort a single linked list in ascending order
                            // (without exchanging data in the nodes)
                            /**************************************************************************

                            There are two methods of sorting presented here(At a time,we can use any of
                            these two functions to sort our single linked list.) -

                            1. Function 'void Sort()' - This function uses selection sort method(I
                            think).
                            In this function,a node whose data is the smallest in the list is made
                            as 'head' node(i.e. starting node of the list) by scanning the whole list
                            once.Then from the remaining list,again a node with the smallest data is
                            found out whose address is kept in the 'next' field of previous node(head
                            node).This process continues to sort the whole list.
                            2. Function 'void Sort_method2()' - This function uses insertion sort
                            method(I think).
                            In this function,starting from second node in the list, all previous node
                            data(starting from 'head' node) are compared with current reference node
                            (which is initially second node in the list).If 'data' field of current
                            reference node is smaller than that of any of its previous nodes,then
                            suitable changes in the 'next' field of corresponding nodes are made.If
                            data in the current reference node is smaller than that in the 'head' node,
                            then the current reference node is made as 'head' node.

                            *********************************************************************/

                            #include<stdio.h>
                            #include<conio.h>
                            #include<alloc.h>
                            #include<stdlib.h>

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

                            struct node *head,*head1;

                            void Create_node(int data);
                            void display();
                            void Sort();
                            void Sort_method2();


                            void main()
                            {
                            int choice,d;
                            clrscr();
                            while(1)
                            {
                            printf("n 1.Create new node");
                            printf("n 2.Sort in ascending order");
                            printf("n 3.Exit");
                            printf("nEnter your choice : ");
                            scanf("%d",&choice);

                            switch(choice)
                            {
                            case 1: printf("nEnter data :");
                            scanf("%d",&d);
                            Create_node(d);
                            break;
                            case 2: Sort(); // At a time,we can use any of these two
                            //Sort_method2(); // functions to sort our single linked list.
                            break;
                            case 3: exit(0);
                            default:exit(0);
                            }
                            } // end of while(1)
                            } // end of main()

                            //--------------------------------------------
                            void Create_node(int d)
                            {
                            struct node *newnode,*temp;
                            newnode = (struct node *)malloc(sizeof(struct node));
                            newnode -> data = d;
                            newnode -> next = NULL;
                            if(head == NULL)
                            head = newnode;
                            else
                            {
                            temp = head;
                            while(temp -> next != NULL)
                            temp = temp -> next;

                            temp -> next = newnode;
                            } // end of 'else'
                            } // end of 'Create_node(int d)'

                            //---------------------------------------------
                            void display() // Print linked list contents
                            {
                            struct node *temp;
                            printf("nList contents are :n");
                            temp = head;
                            while(temp != NULL)
                            {
                            printf(" Data = %d Address = %un",temp->data,temp);
                            temp = temp->next;
                            }
                            printf("n");
                            }
                            //--------------------------------------------
                            void Sort()
                            {
                            struct node *t,*t1,*t2,*t3;
                            t1 = head;
                            head1 = head;
                            if(head == NULL)
                            printf("nThe linked list is empty!");
                            else
                            {
                            while( (t2 = t1 -> next) != NULL)
                            {
                            while(t2 != NULL)
                            {
                            t3 = t2 -> next;
                            if( t1 -> data > t2 -> data)
                            {
                            t2 -> next = t1;
                            for(t = t1; t -> next != t2;t = t -> next);

                            t -> next = t3;
                            t1 = t2; // t1 = Node with smaller data
                            t2 = t3; // t2 = Node to be compared with t1
                            } // end of 'if'
                            else
                            {
                            // t1 = t1; // That is,no change in t1.
                            t2 = t3;
                            }
                            } // end of ' while(t2 != NULL)'

                            if(head == head1) // We want this action only for first pass of
                            { // outer while() loop.Only initially, head = head1.
                            head = t1;
                            head1 = t1 -> next;
                            } // end of 'if(head == head1)'
                            else
                            {
                            for(t = head;t -> next != head1; t = t -> next);

                            t -> next = t1;
                            head1 = t1 -> next;
                            } // end of 'else'

                            t1 = t1 -> next;
                            } // end of 'while( (t2 = t1 -> next) != NULL)'

                            display(); // Display the list.
                            } // end of 'else' of 'if(head == NULL)'
                            } // end of 'Sort()'

                            //--------------------------------------------
                            void Sort_method2()
                            {
                            struct node *t,*t1,*t2,*tt;
                            if(head == NULL)
                            printf("nThe linked list is empty!");
                            else
                            {
                            t1 = head -> next;
                            while(t1 != NULL) // This is i-loop(outer loop).
                            {
                            t2 = t1 -> next;
                            for(t = head; t != t1; t = t -> next) // This is j-loop(inner loop).
                            {
                            if(t1->data < t->data)
                            {
                            t1 -> next = t;
                            for(tt=head; tt->next != t1; tt=tt->next); //end of for loop in 'if'

                            tt -> next = t2;
                            if(t == head)
                            head = t1; // There is only one statement in this 'if'.
                            else // i.e.,'if(t != head)'
                            {
                            for(tt=head; tt->next != t; tt=tt->next);

                            tt -> next = t1;
                            }
                            break;
                            } // end of 'if'
                            } // end of outer 'for' loop
                            t1 = t2;
                            } // end of 'while'

                            display(); // Display the list.
                            } // end of 'else' of 'if(head == NULL)'
                            } // end of 'Sort_method2()'






                            share|improve this answer














                            share|improve this answer



                            share|improve this answer








                            edited Jul 2 '14 at 20:02

























                            answered Jun 11 '14 at 7:32









                            Sagar DamleSagar Damle

                            12




                            12






























                                draft saved

                                draft discarded




















































                                Thanks for contributing an answer to Stack Overflow!


                                • Please be sure to answer the question. Provide details and share your research!

                                But avoid



                                • Asking for help, clarification, or responding to other answers.

                                • Making statements based on opinion; back them up with references or personal experience.


                                To learn more, see our tips on writing great answers.




                                draft saved


                                draft discarded














                                StackExchange.ready(
                                function () {
                                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f11813696%2fsorting-a-linked-list-in-c%23new-answer', 'question_page');
                                }
                                );

                                Post as a guest















                                Required, but never shown





















































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown

































                                Required, but never shown














                                Required, but never shown












                                Required, but never shown







                                Required, but never shown







                                Popular posts from this blog

                                Costa Masnaga

                                Fotorealismo

                                Sidney Franklin