- 締切済み
学生番号,英語,数学,物理という順で一行にかかれたデータを読み込み,各
学生番号,英語,数学,物理という順で一行にかかれたデータを読み込み,各自の合計点が大きい順にクイックソートで並び替えて,出力するプログラム 全体の流れは、 ・先頭を示すポインタを準備。 ・標準入力からデータをリンクドリスとに読み込む。 ・構造体に対するポインタを使ってデータをソートする。 ->一覧を保持する「ポインタへのポインタ」の一覧を作る。 ->データへのポインタのリストを作る。 ->クイックソートで並び替える。 ・構造体に対するポインタを使って、データを表示する このプログラムで、構造体に対するポインタを使ってクイックソートをするプログラムがわかりません。構造体に対するポインタを使って、left,right,pivotやwhile,ifの条件などをどう表現したらよいかが悩みの種です。 配列を使ったクイックソートのプログラムは出来ているので参考にしていますが。うまくいかない状況です。 どなたか教えていただけないでしょうか。 以下参考にしている配列を使ったクイックソートのプログラムの一部です。 void sort(int array[],int left, int right) { int pivot=0,i=0,j=0; i=left; j=right; pivot=array[(left+right)/2]; while(1) { while(array[i]<pivot) { i++; } while (pivot<array[j]) { j--; } if(i>=j) { break; } swap(array,i,j); i++; j--; } if(left < i-1) { sort(array,j+1,right); } if(j+1<right) { sort(array,j+1,right); } } void quickSort(int array[], int size) { int left=0, right=0; left=0; right=size-1; sort(array,left,right); return 1; } よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
- t_nojiri
- ベストアンサー率28% (595/2071)
補足
詳しい回答ありがとうございます。とても参考にはなったのですが、問題のクイックソートのプログラムの記述では配列を使わないみたいです。 以下が問題のプログラムの全体で、バブルソートをクイックソートに変えて作りたいのです。 #include <stdio.h> #include <stdlib.h> struct student { int number; int math; int eng; int phy; int sum; struct student *next; }; typedef struct student Student; void swap(Student **x, Student **y); void bubble(Student **t); int main(void) { Student *top,**sort,**sortTop,*tmp; char line[80]; int count=0; top=(Student *)malloc(sizeof(Student)); top->number=-1; top->math=-1; top->eng=-1; top->phy=-1; top->sum=-1; top->next=NULL; while (fgets(line,sizeof(line),stdin)!=NULL) { tmp=(Student *)malloc(sizeof(Student)); if (tmp==NULL) { fprintf(stderr,"No more memory...\n"); return 1; } count++; tmp->next = top->next; top->next = tmp; sscanf(line,"%d,%d,%d,%d", &(tmp->number), &(tmp->eng), &(tmp->math), &(tmp->phy)); tmp->sum = (tmp->eng) + (tmp->math) + (tmp->phy); } sort=(Student **)malloc((count+1)*sizeof(Student *)); sortTop=sort; tmp=top->next; while (tmp!=NULL) { *sort = tmp; tmp=tmp->next; sort++; } sort=NULL; sort=sortTop; bubble(sort); sort=sortTop; while (*sort!=NULL) { fprintf(stdout,"%8d\t%3d\t%3d\t%3d\t%3d\n", (*sort)->number, (*sort)->eng, (*sort)->math, (*sort)->phy, (*sort)->sum); sort++; } return 0; } void bubble(Student **sort) { Student **t1, **t2; t1=sort; while(*t1!=NULL) { t2=sort; while(*t2!=NULL) { if(((*t1)->sum) > (((*t2)->sum))) { swap(t1,t2); } t2++; } t1++; } return; } void swap(Student **x, Student **y) { Student *tmp; tmp = *x; *x = *y; *y = tmp; return; }