#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/*------------------------
コンテンツ型の定義
--------------------------*/
typedef struct{
char name[32];
int id;
int no;
} contents;
/*------------------------
リスト型の定義
--------------------------*/
typedef struct list_tag{
contents c;
struct list_tag* next;
struct list_tag* prev;
} list;
/*------------------------
新しいノードを作る。
--------------------------*/
list* newList(list** top){
list* ptr;
if( (*top) == NULL ){ //
//printf("DEBUG\n");
if( ( ptr = malloc( sizeof(list) )) == NULL ){
fprintf(stderr,"malloc() error\n");
exit(5);
}
ptr->next=NULL;
ptr->prev=NULL;
(*top)=ptr;
}else{ //
//printf("DEBUG2\n");
ptr=newList(&((*top)->next));
//printf("debug\n");
ptr->prev = (*top);
}
return ptr;
}
/*------------------------
リスト構造のノードの要素全てを表示
--------------------------*/
void showList(list* p){
for( ; p!=NULL; p=p->next){
printf("[%d]:\t%sさん:\t\t%d歳\n",p->c.no, p->c.name, p->c.id);
}
}
/*------------------------
年齢順にソートする
--------------------------*/
void sortList(list* p){
list* i;
list* j;
if(p==NULL){
return ;//この関数の返り値がvoid型なので、空文をリターン
}
//ソートする。バブルソート利用。
for(i=p; i!=NULL; i=i->next){
for(j=p; j!=NULL; j=j->next){
if(j->next!=NULL){
if(j->c.id > j->next->c.id){
contents swap;
swap=j->c;
(j->c)=(j->next->c);
(j->next->c)=swap;
}
}
}
}
}
/*------------------------
ファイルオープン
--------------------------*/
FILE* fileOpen(int argc , char** argv){
FILE* fp;
if(argc != 2){
fprintf( stdout,"Usage : %s [filename.txt]\n",argv[0] );
exit(1);
}
if( ( fp = fopen(argv[1], "r") ) == NULL ){
exit(3);
}
return fp;
}
/*------------------------
main関数
--------------------------*/
int main(int argc, char** argv){
char buf[128]; //ファイルの一行がそのままbufに入る。
int no;
char name[32];
int age;
list* top = NULL;
list* ptr;
FILE* fp = fileOpen(argc , argv);
while(1){
if( fgets( buf, sizeof(buf)/sizeof(buf[0]), fp ) == NULL ){/* sizeof(buf)/sizeof(buf[0])の値は、配列bufの要素数。つまり128。*/
break;//fpからもう読めなくなったら、無限ループから抜ける。
}
if( sscanf(buf, "%d %s %d", &no, name, &age) != 3 ){/*ファイルから読んだ一行から、番号、名前、年齢を各々no,name,ageに格納*/
exit(4);
}
//printf("debug[[[%s]]]" , buf);
//static int i=0;
//printf("%d\n" , i++);
ptr=newList(&top);
ptr->c.no=no;
strcpy( ptr->c.name, name );
ptr->c.id=age;
}
fclose(fp);
puts("\n--------------before sort--------------");
showList(top);
//コンテンツの要素idで昇順にソートする。
sortList(top);
puts("--------------after sort--------------");
showList(top);
puts("");
return 0;
}