リンクリストをソートする

#通常のソート方法
隣接のノードを比較し、どちらかより大きいな数字が存在したら、お互いの数値を交換します。
(ノード数-1)の回数でループが実施されるため、無駄な処理が発生します。

```sort.c
#include <stdio.h>
#include <stdlib.h>

//node declaration and pointer declaration
struct node{
  int data;
  struct node *link;
} *start, *visit;

//function declaration
void displaylist();
void getdata();
void append(struct node **, int);
int count(struct node *);
void selection_sort(int);

void main(){
  //declare value to get length of list
  int n;
  
  //create list
  getdata();
  
  //display list
  printf("Linked list before sorting: \n");
  displaylist();
  
  //get length of list
  n = count(start);

  //sort the list
  selection_sort(n);
  
  //display list
  printf("Linked list after selection sorting: \n");
  displaylist();  
}

//sort linked list(ascend order)
void selection_sort(int num){
  //declare variable for loop counter and value exchange
  int i, temp;
  //declare pointer to be used to set different starting point for loop through list
  struct node *t;
  
  //set starting point to top of list
  t = start;
  
  //loop for the number of length of list - 1
  for(i = 0; i<num-1; i++){
    //set locator pointer to a starting point
    visit = t;
    
    //loop through list
    while(visit->link != NULL){
      //if current value is bigger than the next one, exchange value of each node
      if(visit->data > (visit->link)->data){
         //hold current value of node
         temp = visit->data;
         //insert value from next node into current node
         visit->data = (visit->link)->data;
         //insert value of current node to the next node
         (visit->link)->data = temp;
      }
      //go to next node
      visit = visit->link;
    }
    
    //set starting point to the next node
    t = t->link;
    
  }
  
}

//get length of list
int count(struct node *q){
  //declare variable to store number of nodes
  int c = 0;
  
  //loop through list
  while(q!=NULL){
    //add to count
    c++;
    //go to next node
    q = q->link;
  }
  
  return c;
}

//get value for nodes to be added to list.
void getdata(){
  //declare variable to get inputed value
  int val;
  //declare variable to get yes or no answer. declare variable to clear stdin
  int ch, cs;
  //declare pointer to new list
  struct node *new;
  
  //set pointer to empty
  new = NULL;
  
  //loop for adding nodes to list
  do{
    //ask for value of node
    printf("Enter a value: ");
    scanf("%d", &val);

    //clear stdin. if this is not done, newline will be read into ch.
    while( (cs=getchar()) != '\n' && cs!= EOF);
    
    //append node to new list
    append(&new, val);
    
    //ask if want to add more nodes
    printf("Any more nodes(Y/N): ");
    //get one character
    ch = getchar();
  }while(ch == 'y' || ch == 'Y');
  
  //set pointer to new list
  start = new;
}

//append node to list
void append(struct node **q, int num){
  struct node *temp, *r;
  
  //create new node
  r = malloc(sizeof(struct node));
  //set value of new node
  r->data = num;
  //set link of new node to null
  r->link = NULL;
  
  //if list is empty
  if(*q==NULL){
    //set pointer to new node
    *q = r;
  }else{
    //set locator pointer to top of list
    temp = *q;
    
    //go to last node
    while(temp->link != NULL){
      temp = temp->link;
    }
    
    //set link of last node to new node
    temp->link = r;
    
  }
}

//display node in list
void displaylist(){
  struct node *q;
  
  //set locator pointer to list
  q = start;
  
  //loop through list
  while(q != NULL){
    //print data
    printf("%d\n",q->data);
    //go to next node
    q = q->link;
  }
}
```
#バブルソートの方法
隣接のノードを比較し、どちらかより大きいな数字が存在したら、お互いの数値を交換します。
数値の交換が行われなければ、ループは最後まで実施せず処理が完了します。

```bubblesort.c
#include <stdio.h>
#include <stdlib.h>

//node declaration and pointer declaration
struct node{
  int data;
  struct node *link;
} *start, *visit;

//function declaration
void displaylist();
void getdata();
void append(struct node **, int);
int count(struct node *);
void bubble_sort(int);

void main(){
  //declare value to get length of list
  int n;
    
  //create list
  getdata();
  
  //display list
  printf("Linked list before sorting:\n");
  displaylist();
  
  //get length of list
  n = count(start);
  
  //sort the list
  bubble_sort(n);
  
  //display list
  printf("Linked list after bubble sorting:\n");
  displaylist();
  
}

//bubble sort
void bubble_sort(int num){
  //declare variable for loop and exchange value
  int i, temp;
  //declare variable to count numbers of swipe
  int c;
  
  //loop 
  for(i=0; i<num-1; i++){
    //set locator point to the front of list
    visit = start;
    //set counter to zero
    c = 0; 
  
    //loop until second last node
    while(visit->link!=NULL){
      //if data of current node is bigger than the next node, exchange value
      if(visit->data > (visit->link)->data){
        //hold value of current node
        temp = visit->data;
        //set value of next node to current node
        visit->data = (visit->link)->data;
        //set value of next node with new value
        (visit->link)->data = temp;
        //add to counter
        c++;
      }
      //go to next node
      visit = visit->link;
    }
    
    //if no swap occurs, break out of loop
    if(c==0){
      break;
    }
  
  }
}

//get length of list
int count(struct node *q){
  //declare variable to store number of nodes
  int c = 0;
  
  //loop through list
  while(q!=NULL){
    //add to count
    c++;
    //go to next node
    q = q->link;
  }
  
  return c;
}

//get value for nodes to be added to list.
void getdata(){
  //declare variable to get inputed value
  int val;
  //declare variable to get yes or no answer. declare variable to clear stdin
  int ch, cs;
  //declare pointer to new list
  struct node *new;
  
  //set pointer to empty
  new = NULL;
  
  //loop for adding nodes to list
  do{
    //ask for value of node
    printf("Enter a value: ");
    scanf("%d", &val);

    //clear stdin. if this is not done, newline will be read into ch.
    while( (cs=getchar()) != '\n' && cs!= EOF);
    
    //append node to new list
    append(&new, val);
    
    //ask if want to add more nodes
    printf("Any more nodes(Y/N): ");
    //get one character
    ch = getchar();
  }while(ch == 'y' || ch == 'Y');
  
  //set pointer to new list
  start = new;
}

//append node to list
void append(struct node **q, int num){
  struct node *temp, *r;
  
  //create new node
  r = malloc(sizeof(struct node));
  //set value of new node
  r->data = num;
  //set link of new node to null
  r->link = NULL;
  
  //if list is empty
  if(*q==NULL){
    //set pointer to new node
    *q = r;
  }else{
    //set locator pointer to top of list
    temp = *q;
    
    //go to last node
    while(temp->link != NULL){
      temp = temp->link;
    }
    
    //set link of last node to new node
    temp->link = r;
    
  }
}

//display node in list
void displaylist(){
  struct node *q;
  
  //set locator pointer to list
  q = start;
  
  //loop through list
  while(q != NULL){
    //print data
    printf("%d\n",q->data);
    //go to next node
    q = q->link;
  }
}
```