fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. /*------------------------
  6. コンテンツ型の定義
  7. --------------------------*/
  8. typedef struct{
  9. char name[32];
  10. int id;
  11. int no;
  12. } contents;
  13.  
  14. /*------------------------
  15. リスト型の定義
  16. --------------------------*/
  17. typedef struct list_tag{
  18. contents c;
  19. struct list_tag* next;
  20. struct list_tag* prev;
  21. } list;
  22.  
  23. /*------------------------
  24. 新しいノードを作る。
  25. --------------------------*/
  26. list* newList(list** top){
  27. list* ptr;
  28. if( (*top) == NULL ){ //
  29. //printf("DEBUG\n");
  30. if( ( ptr = malloc( sizeof(list) )) == NULL ){
  31. fprintf(stderr,"malloc() error\n");
  32. exit(5);
  33. }
  34. ptr->next=NULL;
  35. ptr->prev=NULL;
  36. (*top)=ptr;
  37. }else{ //
  38. //printf("DEBUG2\n");
  39. ptr=newList(&((*top)->next));
  40. //printf("debug\n");
  41. ptr->prev = (*top);
  42. }
  43.  
  44. return ptr;
  45. }
  46.  
  47. /*------------------------
  48. リスト構造のノードの要素全てを表示
  49. --------------------------*/
  50. void showList(list* p){
  51. for( ; p!=NULL; p=p->next){
  52. printf("[%d]:\t%sさん:\t\t%d歳\n",p->c.no, p->c.name, p->c.id);
  53. }
  54. }
  55.  
  56. /*------------------------
  57. 年齢順にソートする
  58. --------------------------*/
  59. void sortList(list* p){
  60. list* i;
  61. list* j;
  62. if(p==NULL){
  63. return ;//この関数の返り値がvoid型なので、空文をリターン
  64. }
  65. //ソートする。バブルソート利用。
  66. for(i=p; i!=NULL; i=i->next){
  67. for(j=p; j!=NULL; j=j->next){
  68. if(j->next!=NULL){
  69. if(j->c.id > j->next->c.id){
  70. contents swap;
  71. swap=j->c;
  72. (j->c)=(j->next->c);
  73. (j->next->c)=swap;
  74. }
  75. }
  76. }
  77. }
  78. }
  79.  
  80. /*------------------------
  81. ファイルオープン
  82. --------------------------*/
  83. FILE* fileOpen(int argc , char** argv){
  84. FILE* fp;
  85. if(argc != 2){
  86. fprintf( stdout,"Usage : %s [filename.txt]\n",argv[0] );
  87. exit(1);
  88. }
  89. if( ( fp = fopen(argv[1], "r") ) == NULL ){
  90. exit(3);
  91. }
  92. return fp;
  93. }
  94. /*------------------------
  95. main関数
  96. --------------------------*/
  97. int main(int argc, char** argv){
  98. char buf[128]; //ファイルの一行がそのままbufに入る。
  99. int no;
  100. char name[32];
  101. int age;
  102. list* top = NULL;
  103. list* ptr;
  104.  
  105. FILE* fp = fileOpen(argc , argv);
  106.  
  107. while(1){
  108. if( fgets( buf, sizeof(buf)/sizeof(buf[0]), fp ) == NULL ){/* sizeof(buf)/sizeof(buf[0])の値は、配列bufの要素数。つまり128。*/
  109. break;//fpからもう読めなくなったら、無限ループから抜ける。
  110. }
  111. if( sscanf(buf, "%d %s %d", &no, name, &age) != 3 ){/*ファイルから読んだ一行から、番号、名前、年齢を各々no,name,ageに格納*/
  112. exit(4);
  113. }
  114. //printf("debug[[[%s]]]" , buf);
  115. //static int i=0;
  116. //printf("%d\n" , i++);
  117.  
  118. ptr=newList(&top);
  119. ptr->c.no=no;
  120. strcpy( ptr->c.name, name );
  121. ptr->c.id=age;
  122. }
  123.  
  124. fclose(fp);
  125.  
  126. puts("\n--------------before sort--------------");
  127. showList(top);
  128. //コンテンツの要素idで昇順にソートする。
  129. sortList(top);
  130. puts("--------------after sort--------------");
  131. showList(top);
  132. puts("");
  133. return 0;
  134. }
  135.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In function ‘list* newList(list**)’:
prog.cpp:30:34: error: invalid conversion from ‘void*’ to ‘list* {aka list_tag*}’ [-fpermissive]
stdout
Standard output is empty