Сортировка Динамического Массива Из Структур По Алфавиту

Тема в разделе "Общие вопросы по С и С++", создана пользователем zorra123, 23 окт 2013.

  1. zorra123

    zorra123 New Member

    Регистрация:
    23 окт 2013
    Сообщения:
    2
    Симпатии:
    0
    почти все работает, но есть маленький недочет, сортировка происходит только по фамилии, т.е. предположим, есть 2 человека с одинаковыми фамилиями, то моя программа их не отсортирует, та же фигня, если и фамилия и имя одинаковы, должна происходить сортировка по отчеству, но и она не фурычит. использовал алгоритм qsort(но не через стандартную функцию)
    P.S. через qsort как функцию уже вбитую в си, написал, все збс робит, но это не по заданию(



    Код (C++):
        #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;
    }
     
  2. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    compare у вас сравинвается с -1 и 1,хотя strcmp возвращает любое целое число
     
  3. zorra123

    zorra123 New Member

    Регистрация:
    23 окт 2013
    Сообщения:
    2
    Симпатии:
    0
    а разве strcmp не возвращает 1 в случае, когда 1я строка больше второй, 0 когда они равны и -1, когда 1я меньше 2й?
     
  4. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
Загрузка...
Похожие Темы - Сортировка Динамического Массива
  1. vera2014
    Ответов:
    0
    Просмотров:
    1.067
  2. Liori
    Ответов:
    2
    Просмотров:
    1.002
  3. FCDK
    Ответов:
    0
    Просмотров:
    1.260
  4. ленарано
    Ответов:
    1
    Просмотров:
    1.102
  5. Creder
    Ответов:
    0
    Просмотров:
    1.343

Поделиться этой страницей