2013-07-29 48 views
0

lastname是record.h中定義的EmployeeRecord中的字段,我試圖使用 Qsort對employee [emptotal] .lastname中的字符串進行排序。在cs或C++中使用Qsort中的記錄數組

#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支點[] .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; 
+0

你應該使用'STRCMP(員工[左] .lastname,pivot [(empcount + emptotal)/ 2] .lastname)<0'而不是'&employee [left] .lastname <&pivot [(empcount + emptotal)/ 2] .lastname' – higuaro

+0

所以不是我的原始問題,但感謝您的建議。 –

回答

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); 
+0

我需要知道Qsort的作品,因爲我可以使用「簡單」版本。這就是爲什麼我不使用qsort。我需要學習,設置樞軸的正確方法。儘管非常感謝,我將來會使用它。 –