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;
}
お礼
いえ、頭で考えてもわからなかったので プログラムを実行してみたんですが、どうも結果がおかしかったので 必ずPARSEOKになるはずなので、どうしてもわかりませんでした。 それと、教えていただいて申し訳ありませんが、解決しました。 後で、知人に聞いてみたところ複数のデータを入力するんです。 (*_*) (*_*) のようにするのですから、わからなかったのです。 私の至らなさが足りないばかりに皆さんにご迷惑をおかけしました。 そして、ご協力いただいてありがとうございました。