#include
#include

#define MIN_CODE 210001
#define MAX_CODE 210100
#define MIN_AGE 20
#define MAX_AGE 60


typedef struct data{
int code;
int age;
struct data *next_p;
struct data *before_p;
}shop;

shop *inputData(int code, int age, shop *start_p);
void outputData(shop *start_p);
void free_list(shop *p);

int main(void) {
shop *start_p = NULL; /* 先頭ポインタにNULLを設定 */
shop start={200000,10,NULL,NULL};
shop end={300000,90,NULL,NULL};
start.next_p = &end;
end.before_p = &start;
start_p = &start;

start_p = inputData(210010, 49, start_p);
start_p = inputData(210017, 49, start_p);
start_p = inputData(210012, 30, start_p);
start_p = inputData(210008, 49, start_p);
start_p = inputData(210050, 49, start_p);
start_p = inputData(210011, 30, start_p);

/* リストの表示 */
outputData(start_p);

/* リストの開放 */
free_list(start_p);
return 0;

}
/*** リストにデータを登録 ***/
shop *inputData(int code, int age, shop *start_p)
{
shop *p;

/* 記憶領域の確保 */
if ((p = (shop *) malloc(sizeof(shop))) == NULL) {
printf("malloc error\n");
exit(EXIT_FAILURE);
}

/* リストにデータを登録 */
p->code = code;
p->age= age;

/* ポインタのつなぎ換え */

p->before_p = start_p;
p->next_p = start_p->next_p;
(start_p->next_p)->before_p = p;
start_p->next_p = p;


//p->next_p = start_p; /* 今までの先頭ポインタを次ポインタに */
//start_p = p; /* 新たな領域を先頭ポインタに */

return start_p;
}

/*** リストの表示 ***/
void outputData(shop *start_p)
{
shop *initStart_p = start_p;
int cnt=0;
int cntNum = 0;
int cntLook = 0;
int inputMenu = 0;
shop *look_p;
shop *right_p;

printf("1:現状\n");
printf("2:並び替え\n");
printf(">");
scanf("%d", &inputMenu);
if(inputMenu == 1){
start_p = start_p->next_p;
printf("社員番号 年齢\n");
while (start_p->next_p != NULL) { /* 次ポインタがNULLまで処理 */
printf("%-10d%-2d\n", start_p->code, start_p->age);
start_p = start_p->next_p;
}
}else{
while (start_p != NULL) { /* 次ポインタがNULLまで処理 */
start_p = start_p->next_p;
cntNum++;
}
cntNum = cntNum - 3;

for(cnt=0; cnt < cntNum; cnt++){
start_p = initStart_p;
look_p = start_p->next_p;
right_p = look_p->next_p;
for(cntLook = 0; cntLook < (cntNum - cnt); cntLook++){
if((look_p->code) > (right_p->code)){

look_p->next_p = right_p->next_p;
right_p->before_p = look_p->before_p;
look_p->before_p = right_p;
right_p->next_p = look_p;
(look_p->next_p)->before_p = look_p;
(right_p->before_p)->next_p = right_p;

right_p = look_p->next_p;

}else{
look_p = look_p->next_p;
right_p = look_p->next_p;

}

}
}
start_p = initStart_p;
start_p = start_p->next_p;
printf("社員番号 年齢\n");
while (start_p->next_p != NULL) { /* 次ポインタがNULLまで処理 */
printf("%-10d%-2d\n", start_p->code, start_p->age);
start_p = start_p->next_p;
}
}


}

/*** リストの開放 ***/
void free_list(shop *p)
{
shop *p2;

while (p != NULL) { /* 次ポインタがNULLまで処理 */
p2 = p->next_p;
free(p);
p = p2;
}
}