の順で並んでいる誕生日リストをファイルから読み込んで構造体を用いて誕生日順に線形リストを作成するという問題で、自己参照型構造体を利用して構造体を用いてファイルから誕生日リストを読み込むことまではできたのですが、作成した構造体を誕生日順に並び替える方法が分かりません。配列型構造体を使えば簡単に解決することは分かるのですが、どうにかして自己参照型構造体を用いて解決したいです。
どのようにしたらソートすることが出来るのでしょうか。幾ら考えても分かりません、どうかお願いします。
環境
OS : Windows
VC++ 2015
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int year, month, day;
} DATE;
typedef struct person {
char name[20];
DATE birthday;
struct person *next;
} PERSON;
int main() {
FILE *fp; //ファイルポインタ宣言
int i, j;
int check;
int name[32];
int year = 0, month = 0 , day = 0;
int count = 0;
PERSON *head = NULL, *p, *buf[2];
fp = fopen("birthday_list.txt", "r");
if (fp != NULL) {
while ((check= fscanf(fp, "%[^,],%d,%d,%d", name, &year, &month, &day))!=EOF) {
p = calloc(1, sizeof(PERSON));
p->next = head;
head = p;
strcpy(p->name, name);
p->birthday.year = year;
p->birthday.month = month;
p->birthday.day = day;
count++;
}
//ここでソートをしようとして失敗してます
for (i = 0; i <= count; i++) {
p = head;
for (j = count; i < j; j--) {
buf[0] = p;
buf[1] = p->next;
if (buf[0]->birthday.year < buf[1]->birthday.year) {
p = buf[1];
p->next = buf[0];
}
else if (buf[0]->birthday.year == buf[1]->birthday.year && buf[0]->birthday.month < buf[1]->birthday.month){
p = buf[1];
p->next = buf[0];
}
else if (buf[0]->birthday.month == buf[1]->birthday.month && buf[0]->birthday.day < buf[1]->birthday.day) {
p = buf[1];
p->next = buf[0];
}
p = p->next;
}
}
//ここまで
p = head;
while (p) {
printf("%s,%d,%d,%d\n", p->name, p->birthday.year, p->birthday.month, p->birthday.day);
p = p->next;
}
fclose(fp);
}
else {
printf("file open error\n");
}
return 0;
}