fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct node {
  5. int val;
  6. struct node *next;
  7. } Node;
  8.  
  9. Node *head = NULL;
  10.  
  11. Node* createN(int x){
  12. Node *newnode;
  13. newnode = (Node *)malloc(sizeof(Node));
  14. newnode->val = x;
  15. newnode->next = NULL;
  16. return newnode;
  17. }
  18.  
  19. void freeL(){
  20. Node *p;
  21. while(head != NULL){
  22. p = head->next;
  23. free(head);
  24. head = p;
  25. }
  26. }
  27.  
  28. void printL(){
  29. Node *p = head;
  30. while(p != NULL){
  31. printf("%d ", p->val);
  32. p = p->next;
  33. }
  34. printf("\n");
  35. }
  36.  
  37. void makeL(int n, int a[]){
  38. head = NULL; // 空のリストに初期化
  39.  
  40. for(int i = 0; i < n; i++){
  41. Node *newnode = createN(a[i]);
  42.  
  43. // 頭がNULL、または先頭に入れるべき場合
  44. if (head == NULL || a[i] < head->val){
  45. newnode->next = head;
  46. head = newnode;
  47. } else {
  48. // 挿入位置を探す
  49. Node *p = head;
  50. while(p->next != NULL && p->next->val < a[i]){
  51. p = p->next;
  52. }
  53. newnode->next = p->next;
  54. p->next = newnode;
  55. }
  56. }
  57. }
  58.  
  59. int main(void){
  60. int i, n;
  61. int *a;
  62. scanf("%d", &n);
  63. a = (int*)malloc(sizeof(int) * n);
  64. for(i = 0; i < n; i++){
  65. scanf("%d", &a[i]);
  66. }
  67.  
  68. makeL(n, a); // ソートされたリストを作る
  69. printL(); // 出力
  70. freeL(); // メモリ解放
  71. free(a); // 配列のメモリも忘れずに解放
  72.  
  73. return 0;
  74. }
  75.  
  76.  
Success #stdin #stdout 0s 5320KB
stdin
8
21 55 5 13 8 2 34 3

stdout
2 3 5 8 13 21 34 55