0

lastname はレコード内のフィールドであり、record.h で定義されている EmployeeRecord です。Qsort を使用して、employee[emptotal].lastname の文字列をソートしようとしています。

#include "./record.h"

void externalSort(EmployeeRecord *lastname,int empcount,int emptotal)
{
empcount = 0;
emptotal = 5;
EmployeeRecord employee[emptotal];
int left=empcount,
right=emptotal;
EmployeeRecord pivot[].lastname = employee[(empcount+emptotal)/2].lastname;

  while (left < right) {
// find left candidate
  while (&employee[left].lastname  < &pivot[(empcount+emptotal)/2].lastname) left++; 
// find right candidate 
  while (&employee[right].lastname > &pivot[(empcount+emptotal)/2].lastname) right--; 
  if (left <= right) {
    EmployeeRecord &temp.lastname = &employee[left].lastname;
    &employee[left].lastname = &employee[right].lastname;
    &employee[right].lastname = &temp.lastname;
    left++;
right--;
  } 
} // while left < right
if (empcount < right) externalSort(char *lastname,empcount,right);
if (left < emptotal) externalSort(char *lastname,left,emptotal);

}

非常に多くの異なる変更があり申し訳ありません。最初の数行を行う正しい方法について途方に暮れています。私の主な問題は、宣言行である EmployeeRecord pivot[].lastname = employee[(empcount +emptotal)/2].lastname; ピボットを正しく宣言する方法がわかれば、ソートを正しく割り当てる方法がわかると思います。

(また、一時的な割り当てにも役立ちます。)

(それが役立つ場合はrecord.h)

typedef char STR9[9+1];
typedef char STR7[7+1];
typedef char STR16[16+1];
typedef struct EmployeeRecord
{
   STR9 lastname;
   STR7 firstname;
   STR16 fullname;   
   float hours, 
         overhours,
         pay_rate, 
         defered, 
         gross, 
         fedtax, 
         statetax, 
         ssitax, 
         netpay;
} EmployeeRecord;
4

1 に答える 1

0

まず、コードに多くのエラーがあります。

あなたは間違いなくそれらを見る必要があります。

そして、に基づいてレコードをソートしているようですlastname

なぜあなたは使わないのですqsortか?

このようなもの:

const int no_of_employee =100;

EmployeeRecord *ER[no_of_employee];

static int compare(const void *e1, const void *e2)
{
    EmployeeRecord *tmp1 =*(EmployeeRecord **)e1;
    EmployeeRecord *tmp2 =*(EmployeeRecord **)e2;
    return strcmp( tmp1->lastname,tmp2->lastname);
}


qsort (ER, no_of_employee, sizeof(EmployeeRecord *), compare);

また、よりシンプルにするためにSTLを使用することをお勧めします。

指摘するのはかなり難しく、コード内のすべてのバグは、次のコードと相互に関連してバグを分析します (コードにほぼ似ています)。

void swap(EmployeeRecord *e1, EmployeeRecord *e2)
{
    EmployeeRecord tmp ;
    tmp = *e1;
    *e1 = *e2;
    *e2 = tmp;
}

void externalSort(EmployeeRecord employee[], int start, int end){
    if(start < end){
        int left=start+1, right=end;
        EmployeeRecord pivot = employee[start];
        while(left<right){
            if(strcmp(employee[left].lastname, pivot.lastname) < 0)
                left++;

            else if(strcmp(employee[right].lastname, pivot.lastname) > 0)
                right--;
            else
                swap(&employee[left],&employee[right]);
        }
        if(strcmp(employee[left].lastname, pivot.lastname) < 0){
            swap(&employee[left],&employee[start]);
            left--;
        }
        else{
            left--;
            swap(&employee[left],&employee[start]);
        }
        externalSort(employee, start, left);
        externalSort(employee, right, end);
    }
}

   // externalSort(employee, 0, emptotal);
于 2013-07-29T06:02:56.433 に答える