按結構體某一元素排序的小程式(fishing_3)

To_be_a_fisher發表於2018-08-02

        最近遇到,要排序選最優的問題,有11組3類屬性【a,b,c】的資料,需要在11個b中選出最小的b,並輸出對應的a,c。因為都是數,之前我是打算用陣列來做,宣告3個陣列,然後對其中一個進行排序,然後選出索引對應的其他陣列,但感覺沒思路,覺得可能用結構體陣列可能會簡便些,至少看起來沒那麼多的陣列看著煩,最後寫出來了,一些需要注意的點在程式的註釋部分都寫了。做的測試原始碼如下:

#include "stdio.h"

/***宣告結構體***/
typedef struct   //這裡比直接struct recommand宣告的好處就是,省去了struct recommand mid這樣的宣告。
{
  float w;
  int   k;
  int   f;
}recommand;


void main(void)
{
 int i;
 int j;
 int v;

 #define numbers 11     //結構體陣列大小,方便移植

 recommand re[numbers]; //定義結構體陣列re

 recommand mid; //定義用於交換傳值的中間結構體mid

 recommand *p = re; //定義結構體指標p,指向結構體陣列re的首地址

 /**初始化結構體陣列**/
 for(i = 0;i < numbers;i++)
 {
    re[i].w = 1 + i*1.0/10; //這裡要注意下,浮點數和整數的一些轉換,我在這裡就弄錯過
    re[i].f = 1 + i;
    re[i].k = 20 -i;
    printf("第%d個結構體的資訊為: w :%f  k:%d  f:%d \r\n", i, re[i].w, re[i].k, re[i].f);
 }

/**排序**/
 for(i = 1;i <= (numbers-1);i++) //注意這裡的迴圈次數
 {
     for(j = 0;j <= (numbers - i -1);j++) //注意這裡的迴圈次數
     {
        if((p+j)->k > (p+j+1)->k) //從小到大排序   //(p+j)->k < (p+j+1)->k 從大到小排序
       {
          mid = *(p+j);
          *(p+j) = *(p+j+1);
          *(p+j+1)=mid;
       }
    
     }

 }
 printf("\r\n按k從小到大排序,排序結果為:");

 printf("\r\n");

//列印最後結果
 for(v = 0;v < numbers;v++)
 {
    printf(" w:%f, k:%d, f:%d \r\n", (p+v)->w, (p+v)->k, (p+v)->f);
 }

}

 

程式的結果如下:

 

 

參考的資料:

https://blog.csdn.net/csdn17355456893/article/details/77607340

 

歡迎批評指正交流!

 

 

相關文章