Сортировка динамического массива структур по алфавиту - 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;
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5
Похожие ответы