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

zorra123

New member
23.10.2013
2
0
#1
почти все работает, но есть маленький недочет, сортировка происходит только по фамилии, т.е. предположим, есть 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;
}
 
W

Whatka

#2
compare у вас сравинвается с -1 и 1,хотя strcmp возвращает любое целое число