Сортировка динамического массива структур по алфавиту - C (СИ)
Формулировка задачи:
почти все работает, но есть маленький недочет, сортировка происходит только по фамилии, т.е. предположим, есть 2 человека с одинаковыми фамилиями, то моя программа их не отсортирует, та же фигня, если и фамилия и имя одинаковы, должна происходить сортировка по отчеству, но и она не фурычит. использовал алгоритм qsort(но не через стандартную функцию)
P.S. через qsort как функцию уже вбитую в си, написал, все збс робит, но это не по заданию(
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h> #include <iostream> using namespace std; struct people { char surname[70]; char name[70]; char otchestvo[70]; int nomer; }; void swap(people *a, people *b) { people t; t = *a, *a = *b, *b = t; } int compare (const void *p1,const void *p2) { struct people* ps1 = (struct people*)p1; struct people* ps2 = (struct people*)p2; if (strcmp(ps1->surname,ps2->surname)==0) if(strcmp(ps1->name,ps2->name)==0) return strcmp(ps1->otchestvo,ps2->otchestvo); else return strcmp(ps1->name,ps2->name); else return strcmp(ps1->surname,ps2->surname); } void qs(people* a, int l, int r) { int high = r, low = l; int m = (r + l)/2; do { while(compare(&a[l],&a[m])==-1) l++; while(compare(&a[r],&a[m])==1) r--; if(l <= r) { swap(a[l],a[r]); l++; r--; } } while(l <= r); if(high > l) qs(a, l, high); if(low < r) qs(a,low, r); } int main(void) { int d =0,c=1, k=0,x=0,n_u =0,n_a=1; FILE *in = fopen("H:/data.txt","r"); if (in==NULL ) { printf ("No file"); return 1; } people* mas = (people*)malloc(sizeof(people)*1); for (;;) { if (n_u>=n_a) if (people *mas2 = (people*) realloc(mas, sizeof(people)*(n_a*2))) { mas=mas2; n_a*=2; } else if (people *mas2 = (people*) realloc(mas, sizeof(people)*(n_a+1))) { mas=mas2; n_a++; } if (fscanf(in, "%20s %20s %20s %i", mas[n_u].surname, mas[n_u].name, mas[n_u].otchestvo, &mas[n_u].nomer) == 4) n_u++; else break; } qs(mas,0,n_u) ; for(int i =0; i<n_u; i++) { printf("%s %s %s %i \n", mas[i].surname, mas[i].name, mas[i].otchestvo,mas[i].nomer); } fclose(in); return 0; }
помогите пожалуйста...
Решение задачи: «Сортировка динамического массива структур по алфавиту»
textual
Листинг программы
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h> #include <iostream> using namespace std; struct people { char surname[70]; char name[70]; char otchestvo[70]; int nomer; }; void swap(people *a, people *b) { people t; t = *a, *a = *b, *b = t; } int compare (people *p1,people *p2) { struct people* ps1 = (struct people*)p1; struct people* ps2 = (struct people*)p2; if (strcmp(ps1->surname,ps2->surname)==0) if(strcmp(ps1->name,ps2->name)==0) return strcmp(ps1->otchestvo,ps2->otchestvo); else return strcmp(ps1->name,ps2->name); else return strcmp(ps1->surname,ps2->surname); } void qs(people* a, int l, int r) { int high = r, low = l; int m = (r + l)/2; do { while(compare(&a[l],&a[m])==-1) l++; while(compare(&a[r],&a[m])==1) r--; if(l <= r) { swap(&a[l],&a[r]); l++; r--; } } while(l <= r); if(high > l) qs(a, l, high); if(low < r) qs(a,low, r); } int main(void) { int d =0,c=1, k=0,x=0,n_u =0,n_a=1; FILE *in = fopen("H:/data.txt","r"); if (in==NULL ) { printf ("No file"); return 1; } people* mas = (people*)malloc(sizeof(people)*1); for (;;) { if (n_u>=n_a) if (people *mas2 = (people*) realloc(mas, sizeof(people)*(n_a*2))) { mas=mas2; n_a*=2; } else if (people *mas2 = (people*) realloc(mas, sizeof(people)*(n_a+1))) { mas=mas2; n_a++; } if (fscanf(in, "%20s %20s %20s %i", mas[n_u].surname, mas[n_u].name, mas[n_u].otchestvo, &mas[n_u].nomer) == 4) n_u++; else break; } qs(mas,0,n_u); for(int i =0; i<n_u; i++) { printf("%s %s %s %i \n", mas[i].surname, mas[i].name, mas[i].otchestvo,mas[i].nomer); } fclose(in); return 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д