簡體   English   中英

如何在沒有 qsort() 的情況下使用指針(不是數組索引)對數組或結構進行排序?

[英]How to sort array or structure using pointers (not array index) without qsort()?

我試過 void BubbleSort,但效果不佳。 您知道如何使用指針並基於 mark_lab 值對數組進行排序嗎? 所以首先應該是具有最高 mark_lab 值的元素。

通常我在第一個 for() 的 if 語句中收到錯誤,但它似乎是正確的。

#include <stdlib.h>
#include <string.h>

    struct student{
    char name [20];
    char surname [20];
    char id_num [10]; 
    int mark_lab;
    int mark_test;
    };
int main(){
    int i;

    struct student st[]={
        {"AA", "Pu", "1C666", 8, 9},
        {"RR",  "Ab","4DC33",5,7},
        {"AA", "Z","24C25", 10, 6},
        {"KK", "Oz","161RD", 9,10},
        {"EE", "Pre", "DC902", 7,8}
    }; 

  //to sort the array
   for (i=0;i<4;i++){ 
        if (stu[3]->mark_lab<stu[i]->mark_lab){
            stu[3]->name=stu[i]->name;
            stu[3]->surname=stu[i]->surname;
            stu[3]->id_num=stu[i]->surname;
            stu[3]->mark_lab=stu[i]->mark_lab;
            stu[3]->mark_test=stu[i]->mark_lab;
            
            stu[i]->name=stu[i+1]->name;
            stu[i]->surname=stu[i+1]->surname;
            stu[i]->id_num=stu[i+1]->surname;
            stu[i]->mark_lab=stu[i+1]->mark_lab;
            stu[i]->mark_test=stu[i+1]->mark_lab;
            
            stu[i+1]->name=stu[3]->name;
            stu[i+1]->surname=stu[3]->surname;
            stu[i+1]->id_num=stu[3]->surname;
            stu[i+1]->mark_lab=stu[3]->mark_lab;
            stu[i+1]->mark_test=stu[3]->mark_lab;
        }
    }
    
    //to print it on the screen
    for (i=0;i<4;i++){
        printf (printf("\nName: %s, Surname: %s, ID: %s, Lab_Mark: %d, Test Mark: %d",
         stu[i]->name, stu[i]->surname,stu[i]->id_num, stu[i]->mark_lab,stu[i]->mark_test);
    }

    return 0;
}

這里發生了很多事情,所以讓我們在不直接向您提供答案的情況下分解出什么是錯的以及該怎么做。 “最簡單”的解決方案是 sweenish 建議使用 std::sort 和比較 function,但如果您需要自己實現排序,這里是您需要采取的步驟的粗略細分,而不會給您整個實現。


雜項錯誤

  • 您的數組名為“stu”,但您正嘗試使用名稱“st”訪問它。 您的編譯器應該立即警告您(如果您甚至試圖編譯它)這個問題。
  • 您正在嘗試通過使用“->”取消引用結構來訪問學生元素。 您的數組存儲學生,而不是堆分配的學生 *,因此您需要使用“。”訪問運算符,或 malloc 數組中的每個學生。
  • drescherjm 還指出了您的 printf(printf( 錯誤
  • 就個人而言,我喜歡“typedef”我的結構,但你不必這樣做。

交換

首先,交換 function 將使您的生活更輕松。 我們可以簡單地使用兩個元素的數組和索引進行交換。 簡單的方法是使用臨時變量,盡管您也可以使用 XOR 交換(它有自己的警告)。 請記住,當使用 function 修改數組時,我們需要通過引用傳遞數組,因為數組存儲在 main() 的堆棧框架中,並且我們希望我們的函數更改保持不變,所以我們必須通過數組傳遞參考。 有關這方面的更多信息,請參見此處。 您的交換 function 應該看起來像這樣。

void swap(struct *students[], int idx_a, int idx_b) {
    struct student temp = *students[idx_a];
    *students[idx_a] = *students[idx_b];
    *students[idx_b] = temp;
}

我注意到您還將 struct id_num's 設置為姓氏。 如果這是您實際上應該做的事情,您還需要在此交換 function 中考慮這一點。


排序

您將使用您的交換 function 來實現排序。 您說您使用的是冒泡排序,所以這是可能看起來的偽代碼。 請記住,您進行了反向排序(最大優先),因此您的比較需要從正常的冒泡排序實現中“翻轉”。

for (i = 0; i < 4; i++) {
    for ( j = 0; j < 4 - i - 1; j++) {
        if (st[j].mark_lab < st[j+1].mark_lab)
           swap(&st, j, j+1);
    }
}

這應該能讓你大部分時間到達那里。 將來,我強烈建議在嘗試調試或進入 stackoverflow 之前編譯此代碼,因為編譯器比你我聰明得多,並且會為你遇到的許多錯誤提供描述性解釋。 嘗試使用 'gcc -o [executable_name] [your_program.c]' 進行編譯。 當您清理編譯時錯誤時,您可以使用 ./[executable_name] 運行以嘗試診斷您可能遇到的任何運行時錯誤。

總的來說,我建議鞏固你對 C 語法的理解,以及指針和結構如何工作的基礎知識。 當您發現自己編寫了許多冗余代碼行時,例如 for 循環的大部分主體,請停止編碼。 重新評估你到底想要做什么,並嘗試找到一種更清潔的方法來做這件事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM