c言語の問題です。ファイルからデータを読み込み連結リストに記憶しソートするプログラムです。お願いします
ソート部分がどうしてもできません。
またソートは以下のアルゴリズムで行うものです
与えられたリストをリストA、ソート済みのリストをリストBとする。処理の開始段階では、リストBは空である。
1.リストAの要素の中で、最大値をもつ要素Cを探す。
2.要素CをリストAから削除する。
3.要素CをリストBの先頭に挿入する。
4.リストAが空であれば終了。空でなければ 1. にもどる。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct physical Physical;
struct physical {
char name[41];
int age;
float height;
float weight;
Physical *next;
};
void read_data(char *file,Physical *p,Physical *tail);
int comp1(const Physical *, const Physical *);
int comp2(const Physical *, const Physical *);
int comp3(const Physical *, const Physical *);
int comp4(const Physical *, const Physical *);
void sort(char *arg,Physical *p,Physical *q);
Physical *listsort(Physical *p, int (*compar)(const void *, const void *));
int main(void) {
char s[20],t,u[20];
Physical *p,*tail,*q;
p=malloc(sizeof(Physical));
q=malloc(sizeof(Physical));
tail=malloc(sizeof(Physical));
while(1)
{ printf("CMD>");
fflush(stdout);
fgets(s,20,stdin);
sscanf(s,"%c %s",&t,u);
switch(t){
case 'q':exit(0);
case 'r':read_data(u,p,tail);
break;
case 's':sort(u,p,q);
break;
case 'd':
while(q!=NULL)
{ printf("%s %d %.1f %.1f ",q->name,q->age,q->height,q->weight );
q=q->next;}
break;
}
}
free(p);
return 0;
}
void read_data(char *file,Physical *p,Physical *tail){
FILE *fp;
char string[100];
Physical header;
tail=&header;
header.next = NULL;
p->next = NULL;
tail->next = p;
tail = p;
if ((fp = fopen(file, "r")) == NULL)
{ exit(1); }
while(fgets(string,sizeof(string),fp)!= NULL)
{ sscanf(string,"%s %d %f %f",p->name,&p->age,&p->height,&p->weight);
Physical *tail2;
tail2=malloc(sizeof(Physical));
tail2->next=NULL;
p->next=tail2;
p=tail2;
}
fclose(fp);
}
void sort(char *arg,Physical *p,Physical *q){
if(strcmp(arg,"name") == 0)
q=listsort(p,(int(*)(const void*, const void*))comp1);
if(strcmp(arg,"age") == 0)
q=listsort(p,(int(*)(const void*, const void*))comp2);
if(strcmp(arg,"height") == 0)
q=listsort(p,(int(*)(const void*, const void*))comp3);
if(strcmp(arg,"weight") == 0)
q=listsort(p,(int(*)(const void*, const void*))comp4);
}
Physical *listsort(Physical *p,int (*compar)(const void *, const void *)){
Physical *q, *max,*s,*head;
s=malloc(sizeof(Physical));
head=malloc(sizeof(Physical));
head=NULL;
while(p->next){max = p, q = p->next;
while( q->next ) {
if( compar(q->next,max->next) )
max = q;
q = q->next;}
s=max->next;
max->next=max->next->next;
if(head==NULL)
{head=s;}
s->next=s;
}
return head;
}
int comp1(const Physical *a, const Physical *b){
return (strncmp(a->name,b->name,sizeof(Physical)));
}
int comp2(const Physical *a, const Physical *b){
if(a->age > b->age) return 1;
else return 0;
}
int comp3(const Physical *a, const Physical *b){
if(a->height > b->height) return 1;
else return 0;
}
int comp4(const Physical *a, const Physical *b){
if(a->weight > b->weight) return 1;
else return 0;
}
お礼
ありがとうございます。指摘していただいたところを改良してみます。