结构体数组排序问题

struct Nation
{
char country[100];
int gold_medal;
int silver_medal;
int bronze_medal;
int sum;
};
Nation str[10]={
{"China",199,119,98,416},
{"Korea",76,65,91,232},
{"Japan",48,74,94,216},
{"Iran",20,14,25,59},
{"Kazakhstan",18,23,38,79},
{"India",14,17,33,64},
{"Chinese_Taipei",13,16,38,67},
{"Uzbekistan",11,22,23,56},
{"Thailand",11,9,32,52},
{"Malaysia",9,18,14,41}};
求高手帮我用c++把这个结构体按照country(国家首字母A-Z)和sum(升序)分别排序,谢谢了

第1个回答  2011-11-30
使用
void qsort(void *base, size_t nelem, size_t width, int (_USERENTRY *fcmp)(const void *, const void *));
库函数就可以完成了

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

struct Nation
{
char country[100];
int gold_medal;
int silver_medal;
int bronze_medal;
int sum;
};

Nation str[10]={
{"China",199,119,98,416},
{"Korea",76,65,91,232},
{"Japan",48,74,94,216},
{"Iran",20,14,25,59},
{"Kazakhstan",18,23,38,79},
{"India",14,17,33,64},
{"Chinese_Taipei",13,16,38,67},
{"Uzbekistan",11,22,23,56},
{"Thailand",11,9,32,52},
{"Malaysia",9,18,14,41}};

int sort_by_country( const void *a, const void *b)
{
Nation *pa=(Nation *)a,*pb=(Nation *)b;
return( strcmp(pa->country,pb->country) );
}

int sort_by_sum( const void *a, const void *b)
{
Nation *pa=(Nation *)a,*pb=(Nation *)b;
if(pa->sum>pb->sum) return 1;
else if(pa->sum==pb->sum) return 0;
else return -1;
}

int main()
{
int n;
printf("\nsort by country:\n");
qsort(str,10,sizeof(Nation),sort_by_country);
for(n=0;n<10;n++)
{
printf("%s %d %d %d %d\n",str[n].country,str[n].gold_medal,
str[n].silver_medal,str[n].bronze_medal,str[n].sum);
}

printf("\nsort by sum:\n");
qsort(str,10,sizeof(Nation),sort_by_sum);
for(n=0;n<10;n++)
{
printf("%s %d %d %d %d\n",str[n].country,str[n].gold_medal,
str[n].silver_medal,str[n].bronze_medal,str[n].sum);
}

getchar();
return 0;
}
第2个回答  2011-11-30
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
struct Nation
{
char country[100];
int gold_medal;
int silver_medal;
int bronze_medal;
int sum;

};
Nation str[10]={
{"China",199,119,98,416},
{"Korea",76,65,91,232},
{"Japan",48,74,94,216},
{"Iran",20,14,25,59},
{"Kazakhstan",18,23,38,79},
{"India",14,17,33,64},
{"Chinese_Taipei",13,16,38,67},
{"Uzbekistan",11,22,23,56},
{"Thailand",11,9,32,52},
{"Malaysia",9,18,14,41}};
bool isgreate(const Nation& n1,const Nation& n2)
{
return n1.sum<n2.sum;
}
bool operator < (const Nation& n1,const Nation& n2)
{
return string(n1.country,n1.country+20)<string(n2.country,n2.country+100);
}
int main()
{
vector<Nation> vecn;
for(int i=0;i!=10;i++)
vecn.push_back(str[i]);
stable_sort(vecn.begin(),vecn.end());
cout<<"按照country的结果:"<<endl;
for(vector<Nation>::iterator it=vecn.begin();it!=vecn.end();++it)
{
string ss(it->country,it->country+20);
cout<<ss<<" "<<it->gold_medal<<" "<<it->silver_medal<<" "<<it->bronze_medal<<" "<<it->sum<<endl;
}
cout<<"按照sum排序的结果:"<<endl;
stable_sort(vecn.begin(),vecn.end(),isgreate);
for(vector<Nation>::iterator it=vecn.begin();it!=vecn.end();++it)
{
string ss(it->country,it->country+20);
cout<<ss<<" "<<it->gold_medal<<" "<<it->silver_medal<<" "<<it->bronze_medal<<" "<<it->sum<<endl;
}

return 0;
}
vs2010编译通过
第3个回答  2011-11-30
#include "stdio.h"
#include "string.h"

struct Nation
{
char country[100];
int gold_medal;
int silver_medal;
int bronze_medal;
int sum;
};
Nation str[10]={
{"China",199,119,98,416},
{"Korea",76,65,91,232},
{"Japan",48,74,94,216},
{"Iran",20,14,25,59},
{"Kazakhstan",18,23,38,79},
{"India",14,17,33,64},
{"Chinese_Taipei",13,16,38,67},
{"Uzbekistan",11,22,23,56},
{"Thailand",11,9,32,52},
{"Malaysia",9,18,14,41}};

void main()
{
int i,j;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(strcmp(str[j].country,str[j+1].country)>0)
{
Nation temp=str[j];
str[j]=str[j+1];
str[j+1]=temp;
}
for(i=0;i<10;i++)
{
printf("%s,%d,%d,%d,%d\n",str[i].country,str[i].gold_medal,str[i].silver_medal,str[i].bronze_medal,str[i].sum);
}
printf("\n");

for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(str[j].sum<str[j+1].sum)
{
Nation temp=str[j];
str[j]=str[j+1];
str[j+1]=temp;
}
for(i=0;i<10;i++)
{
printf("%s,%d,%d,%d,%d\n",str[i].country,str[i].gold_medal,str[i].silver_medal,str[i].bronze_medal,str[i].sum);
}
printf("\n");
}
第4个回答  推荐于2016-02-20
#include<iostream>
#include<string.h>
using namespace std;
struct Nation
{
char country[100];
int gold_medal;
int silver_medal;
int bronze_medal;
int sum;
};
struct Nation str[10]={
{"China",199,119,98,416},
{"Korea",76,65,91,232},
{"Japan",48,74,94,216},
{"Iran",20,14,25,59},
{"Kazakhstan",18,23,38,79},
{"India",14,17,33,64},
{"Chinese_Taipei",13,16,38,67},
{"Uzbekistan",11,22,23,56},
{"Thailand",11,9,32,52},
{"Malaysia",9,18,14,41}};
void sortbynation()
{
int i,j;
for(i=1;i<10;i++)
{
for(j=0;j<10-i;j++)
if(strcmp(str[j].country,str[j+1].country)>0)
{
struct Nation temp;
temp = str[j];
str[j]= str[j+1];
str[j+1]= temp;
}
}
cout<<endl;
for(i=0;i<10;i++)
{
cout<<str[i].country<<" "<<str[i].gold_medal<<" "<<str[i].silver_medal<<" "<<str[i].bronze_medal<<" "<<str[i].sum<<endl;
}
}
void sortbysum()
{
int i,j;
for(i=1;i<10;i++)
{
for(j=0;j<10-i;j++)
if(str[j].sum>str[j+1].sum)
{
struct Nation temp;
temp = str[j];
str[j]= str[j+1];
str[j+1]= temp;
}
}
cout<<endl;
for(i=0;i<10;i++)
{
cout<<str[i].country<<" "<<str[i].gold_medal<<" "<<str[i].silver_medal<<" "<<str[i].bronze_medal<<" "<<str[i].sum<<endl;
}
}
int main()
{
sortbynation();
sortbysum();
return 0;
}本回答被提问者采纳
相似回答