2015-02-10 64 views
0

我有一個關於在結構中對元素進行排序的問題。如果我有兩種結構:對結構中的特定元素進行排序

typedef struct 
{ 
    char name[25],surname[25]; 
    int number; 
}PLAYER; 

typedef struct 
{ 
    char nameofteam[25]; 
    int numberofplayers; 
    PLAYER *players; 
}TEAM; 

如何通過在球衣(int number)上升的數字順序關於球員在一個團隊中的數據進行排序?功能原型是void sort(TEAM *)

這給出了一個錯誤.exe has stopped working

void sort(TEAM *p) 
{ 

    int i,j; 
    for(i=0;i<p->numberofplayers-1;i++) 
    for(j=i+1;j<p->numberofplayers;j++) 
    if((p[i].players)->number > (p[j].players)->number) 
    { 
     TEAM temp=p[i]; 
     p[i]=p[j]; 
     p[j]=temp; 
    } 
} 

的問題是關於球衣(int number)這個數字是不是在結構TEAM

當分揀特定元素是在結構上,然後檢查會是這樣的:

if(p[i].element > p[j].element) 

我應該在這個函數中使用動態分配*players

感謝您的答案。

+1

我認爲索引'p-> players []'而不是'p []'會對這個算法產生奇蹟,*無論如何分配'players'。現在你正在嘗試根據他們的* first *球員的數量對多個*球隊*進行排序。 – WhozCraig 2015-02-10 09:38:40

+1

而你不想使用'qsort'? – 2015-02-10 09:39:54

+0

我總是創建自己的函數,但如果你有一個qsort的想法,然後讓我知道。謝謝。 – user300045 2015-02-10 09:45:49

回答

1

你的代碼邏輯索引斷開p,這是基指針,而不是球員基指針隊。不論你看到這一點:

p[i] 

應該是這樣的:

p->players[i] 

一旦被尋址,適當的交換溫度要求爲好,這應該是一個PLAYER,而不是一個TEAM

像這樣的東西:

void sort(TEAM *p) 
{ 
    int i,j; 
    for(i=0; i<p->numberofplayers-1; ++i) 
    { 
     for(j=i+1; j<p->numberofplayers; ++j) 
     { 
      if(p->players[i].number > p->players[j].number) 
      { 
       PLAYER tmp = p->players[i]; 
       p->players[i] = p->players[j]; 
       p->players[j] = tmp; 
      } 
     } 
    } 
} 

所有這個諷刺g你正確地分配了團隊的成員,並且numberofplayers準確地反映了該分配。

祝你好運。

+0

謝謝。我只需要在main()中調用它。 – user300045 2015-02-10 09:57:31

+0

@NemanjaGrubor你從哪裏來的沒有區別;代碼本身是錯誤的。如果正確設置了「TEAM」,包括正確設置「players」成員和「numberofplayers」成員,則您在上面看到的是對球隊球員進行排序所需的內容。如果沒有,那麼無論如何你都會有其他問題,而且我可以全部 - 但 - 保證他們以某種方式參與播放器設置。 – WhozCraig 2015-02-10 10:01:10

相關問題