2016-04-08 16 views
-2

Ich versuche, ein Array von Zeigern zu sortieren, die auf ein Zeichenarray von Namen zeigen. Ich kann das Programm bekommen, um die ersten zwei Namen zu sortieren, aber nicht den Rest. Auch die Namen sind Teil einer Struktur.Array von Zeigern sortieren

void sort(Class* ptrs[], int num_classes){ 
    bool swap=false; 

    do 
    { 
     swap=false; 
     for (int i=0; i<=num_classes-1; i++) { 

      if (ptrs[i]->title[i]>ptrs[i+1]->title[i]) { 
       Swap(&ptrs[i], &ptrs[i+1]); 
       swap=true; 
      } 
     } 
    }while(swap); 
} 

void Swap(Class** num1,Class** num2){ 

    Class* temp=*num1; 
    *num1=*num2; 
    *num2=temp; 
} 

struct Class{ 
    char title[MAX]; 
    int units; 
    char grade; 
}; 

int main(){ 
    int choice,num_classes=0; 
    char class_selection[MAX]; 
    Class* ptrs[MAX]; 
    char* class_ptr[MAX]; 
    bool Continue=false; 
    Class classes[MAX]; 

    for (int i = 0; i < MAX; i++){ 
     ptrs[i]=&classes[i]; 
    } 


    cout<<" 1. Add new class"<<endl<<" 2. Edit an existing class"<<endl<<" 3. Display a class"<<endl<<" 4. List all classes"<<endl<<" 5. Display GPA"<<endl<<" 6. Delete all classes"<<endl<<" 7. Quit"<<endl<<"Enter selection number: "; 

    cin>>choice; 
    if (choice!=7) { 
     Continue=true; 
    } 
    switch (choice) { 
     case 1: 
      add(ptrs,num_classes); 
      num_classes++; 
      break; 

     case 2: 
      edit(ptrs,num_classes); 
      cin.ignore(); 
      break; 
     case 3: 
      sort(ptrs,num_classes); 
      cin.ignore(); 
      cout<<"Enter the name of the class to display: "; 
      cin.getline(class_selection, MAX); 
      for (int j =0; j<MAX; j++) { 
       class_ptr[j]=&class_selection[j]; 
      } 
      Bin_search(ptrs,num_classes,class_ptr); 

      break; 
     case 4: 
      sort(ptrs,num_classes); 
      display(ptrs,num_classes); 
      break; 
     case 5: 
      //  display_GPA(); 
      break; 
     case 6: 
      // delete_end(); 
      break; 
    } 
    if (choice == 7) { 
     // delete_end(); 
     //system('pause"); 
     return 0; 
    } 
} 
+0

hinzufügen main() bitte und was/wo ist der Fehler –

+0

Vereinfachen Sie Ihr Leben noch mehr mit Hilfe von 'std :: vector '. Sie könnten die Funktion 'std :: sort' verwenden. –

+0

Für eine Blasensortierung sollten Sie eine Schleife erstellen, bis der Container sortiert ist, nicht nach der Anzahl der Objekte im Container. –

Antwort

0

Dieser Code vergleicht i -te Zeichen der entsprechenden Titel, nicht die ganze Titel:

if (ptrs[i]->title[i]>ptrs[i+1]->title[i]) { 
//    ^^^     ^^^ 

Mögliche Arten zu lösen:

  1. Ändern Sie diese

    char title[MAX]; 
    

    zu

    std::string title; 
    

    Und danach können Sie

    if (ptrs[i]->title > ptrs[i+1]->title) { 
    
  2. nur schreiben, wenn Sie nicht std::string aus irgendeinem Grund verwenden können, verwenden strcmp:

    if (strcmp(ptrs[i]->title, ptrs[i+1]->title) > 0) {