struct Mapmess
{
unsigned int Crosscolumn;
unsigned int Branch;
unsigned int Roadflag;
unsigned short Recordsize;
unsigned int LinkID;
unsigned short Roadnamesize;
char Roadname[30];
};
已经定义好的一个结构体,结构体如上,
然后我定义了一个结构体数组 struct Mapmess maps[length];
length的长度等于63600
然后我根据fopen函数把一个dat的相应的63600条信息读取到这个结构体数组中;
然后我利用数组里的linkid对这个数组信息进行排序;
程序如下:
void Sequencing()
{
int i,j,k;
//struct Mapmess temp;
unsigned int temp;
printf("正在排序中,请稍后....\n");
for(i=0;i<length-1;i++)
{
for(j=0;j<length;j++)
{
if(maps[i].LinkID<maps[j].LinkID)
{
temp = maps[i].LinkID;
maps[i].LinkID = maps[j].LinkID;
maps[j].LinkID = temp;
}
}
}
printf("排序完成!\n");
}
然而排序完后再输出LinkID
就变成了
0 40 140 240 340......一直到60000每次加100;
求大神告诉我一下这个到底是为什么啊
我测试了读取后LinkID都是正确
排序过程中也是对的
为什么出来就变了呢!
看看你的输出函数。感觉你怎么直接改变结构体的内容。
你的排序算法有问题,修改如下:
但是还有一个问题,你把LinkID排序了,结构体没变,是不是乱套了?
结构体不需要排序?
void Sequencing()
{
int i,j,k;
//struct Mapmess temp;
unsigned int temp;
printf("正在排序中,请稍后....\n");
for(i=0;i<length-1;i++)
{
for(j=i+1;j<length;j++)//修改
{
if(maps[i].LinkID<maps[j].LinkID)
{
temp = maps[i].LinkID;
maps[i].LinkID = maps[j].LinkID;
maps[j].LinkID = temp;
}
}
}
printf("排序完成!\n");
}
有个可以对结构体数组快速排序的函数qsort(),你可以参考一下。
注释一下.很多时候我们都会对结构体排序,比如校赛预选赛的那个樱花,一般这个时候都在
cmp函数里面先强制转换了类型,不要在return里面转,我也说不清为什么,但是这样程序会
更清晰,并且绝对是没错的. 这里同样请注意double返回0的问题
#include <stdio.h>
#include <stdlib.h>
struct node
{
double date1;
int no;
} s[100];
int i,n;
int cmp(const void *a,const void *b)
{
struct node *aa=(node *)a;
struct node *bb=(node *)b;
return(((aa->date1)>(bb->date1))?1:-1);
}
int main()
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
s[i].no=i+1;
scanf("%lf",&s[i].date1);
}
qsort(s,n,sizeof(s[0]),cmp);
for(i=0;i<n;i++) printf("%d %lf/n",s[i].no,s[i].date1);
return(0);
}
你这是对结构体排序吗,你这是直接修改linkid 啊。那不管怎么说对linkid来说已经是从小到大了,问题在输出函数,
孩子,我看到你这样排序我也懵逼了,你就把ID变了一下,结构体的其他内容你都没交换。
先不谈你的排序算法的问题…假设可以排序…
如果输出没错的话,也许,linkid的值本来就是这样的…只不过被你排序了才发现“哦,原来是有差一百这样的规律…”,因为原来那么多数无序的时候是看不出这种规律的。
建议使用库函数qsort