構造体のリストを並び替えたい。リストを並び替えるプログラムを作ったが、構造体メンバごとに昇順、降順に並び替えたい。
2:ソートを押下
↓
名前 住所
↓
昇順、降順
↓
並び替え
といったプログラムにしたいです。
いまのプログラムは住所について並び直しています。
名前について並び直したいときは、もう一つソート関数のコードを書く以外の書き方がわかりません。構造体ポインタのメンバを引数にする?とか可能なのでしょうか?
また、降順についても、わかりやすい書き方がしたいです。
以下ソースコードになります。
#include <stdio.h> #include <string.h> #include <stdlib.h> #define NO_PROBLEM 0 #define ERROR 1 typedef struct student { int id; char name[10 + 1]; char address[10 + 1]; struct student *next; } PERSON_t; static PERSON_t *head = NULL; static PERSON_t *tail = NULL; int add_person(int id); int sort_person(void); void print_person(PERSON_t *p); PERSON_t * quick_sort(PERSON_t *a); int main(void) { int number = 0; int id = 0; while (1) { printf("1.追加入力 2.ソート 3.表示 0.終了: "); scanf("%d", &number); switch (number) { case 0: return 0; case 1: if (add_person(++id) == NO_PROBLEM){ puts("追加完了"); } break; case 2: head = quick_sort(head ); puts("並べ替え完了"); break; case 3: print_person(head); } } } PERSON_t * quick_sort(PERSON_t *a) { PERSON_t *pivot = a; //初めの文字をpivotとする a = head 基準 PERSON_t *less = NULL; //基準より小さい PERSON_t *greater = NULL; //基準より大きい PERSON_t *z; if (a == NULL || a->next == NULL){ //何もなかったらreturn puts("NULL"); return a; } puts("1"); a = a->next; pivot->next = NULL; while (a) { int diff; diff = strcmp(a->address, pivot->address); if (diff < 0){ z = a; a = a->next; z->next = less; less = z; } else if (diff > 0){ z = a; a = a->next; z->next = greater; greater = z; } else { z = a; a = a->next; z->next = pivot; pivot = z; } } less = quick_sort(less); greater = quick_sort(greater); if (less == NULL){ a = pivot; printf("基準%s",pivot); } else { for (a = z = less; z && z->next; z = z->next) ; z->next = pivot; } for (z = pivot; z->next; z = z->next) ; puts("8"); z->next = greater; return a; } int add_person(int id) { PERSON_t *data; data = (PERSON_t *)malloc(sizeof(PERSON_t)); data->id = id; printf("ID->%d\n", data->id); scanf("%10s", data->name); fflush(stdin); scanf("%10s", data->address); data->next = NULL; if (head == NULL) { head = data; tail = data; } else { tail->next = data; tail = data; } return NO_PROBLEM; } void print_person(PERSON_t *p) { for (; p; p = p->next){ printf(" %s", p->name); printf(" %s\n", p->address); } putchar('\n'); }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。