2015-02-10 53 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

相关问题