C语言 结构体如何排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 结构体如何排序相关的知识,希望对你有一定的参考价值。

typedef struct

char number[10];//书号
char name[50];//书名
char author[20];//作者
char publish[50];//出版社
char time[20];//出版时间
float price;//单价
mbook;
typedef struct

int count;//书的本数
mbook book[N];//最大可有书的数量
mlibrary;
mlibrary library;
问题出现在排序上,核心问题是不知道如何交换结构体。望高手解答,感谢~
一下是排序的程序源
void sort_by_number() /*定义按书号排序函数*/

struct mbooktemp;
int i,j,k;
for(i=0;i<library.count-1;i++)

k=i;
for(j=i+1;j<library.count;j++)
if(library.book[j].number<library.book[k].number)
k=j;
if(k!=i)

mbooktemp=library.book[k];
library.book[k]=library.book[i];
library.book[i]=mbooktemp;



还是不行呀,您的意思是这样?
typedef struct

char number[10];//书号
char name[50];//书名
char author[20];//作者
char publish[50];//出版社
char time[20];//出版时间
float price;//单价
mbook,mbooktemp;

由于你只是交换字符串,所以修改如下,请检验。
定义一个字符串数组 char sn[10];
交换时进行如下修改
strcpy(sn,library.book[k].number);
strcpy(library.book[k].number,library.book[i].number);
strcpy(library.book[i].number,sn);

用strcpy(s1,s2)进行复制字符串,不能直接s1=s2。
#include<stdio.h>
#include <time.h>
typedef struct

char number[10];//书号
char name[50];//书名
char author[20];//作者
char publish[50];//出版社
char time[20];//出版时间
float price;//单价
mbook;
typedef struct

int count;//书的本数
mbook book[10];//最大可有书的数量
mlibrary;
mlibrary library,t;

main()
void sort_by_price(void);
sort_by_price();

void sort_by_price(void) /*定义按价格排序函数*/

int i,j,k;
char sn[10];
for(i=0;i<library.count-1;i++)

k=i;
for(j=i+1;j<library.count;j++)
if(library.book[j].price<library.book[k].price)
k=j;
if(k!=i)

strcpy(sn,library.book[k].number);
strcpy(library.book[k].number,library.book[i].number);
strcpy(library.book[i].number,sn);


;
参考技术A

    排序需要比较,对于结构体,并没有现成的比较方式,必须人为指定结构体的比较方式。

    可以使用qsort函数进行排序,使用该函数必须传入一个比较函数。

    例如:

    int mycmp(const void *a, const void *b)
       return (*(Information *)a)->average > (*(Information *)b)->average ? 1 : -1;

参考技术B 逐个成员交换是一种办法,另外,考虑换用链表应该更容易些,效率也会提高。。

C语言结构体排序

求问各位dalao
typedef struct
char thread_name[3];
unsigned int require_moment;
unsigned int persist_time;
TEST_INFO;
TEST_INFO test_data[]=
"r1",0,3,
"r2",1,6,
"w1",3,5,
"r3",2,5,
"w2",5,5,
"w3",4,5,
"r4",7,5,
"r5",9,5,
"w4",8,5,
"w5",12,5
;
要求对require_moment从小到大进行排序,然后输出排序后的thread_name,应该怎么做

代码如下:

#include<stdio.h> 

typedef struct
char thread_name[3];
unsigned int require_moment;
unsigned int persist_time;
TEST_INFO;

TEST_INFO test_data[] = 
 "r1", 0, 3 ,
 "r2", 1, 6 ,
 "w1", 3, 5 ,
 "r3", 2, 5 ,
 "w2", 5, 5 ,
 "w3", 4, 5 ,
 "r4", 7, 5 ,
 "r5", 9, 5 ,
 "w4", 8, 5 ,
 "w5", 12, 5 
;

int main()

int i, j, size;
TEST_INFO temp;

// 数组元素个数
size = 10;

// 排序

for (i = 0; i < size - 1; i++) 
for (j = i + 1; j < size; j++) 
if (test_data[i].require_moment > test_data[j].require_moment) 
memcpy(&temp, &test_data[i], sizeof(TEST_INFO));
memcpy(&test_data[i], &test_data[j], sizeof(TEST_INFO));
memcpy(&test_data[j], &temp, sizeof(TEST_INFO));




// 输出

for (i = 0; i < size; i++) 
printf("%s ", test_data[i].thread_name);


printf("\\n");

return 0;

运行结果:

参考技术A 就比较test_data结构体数组里面的值
直接调用test_data[i].require_moment,就变成数字之间的比较大小
可以使用简单的冒泡排序,然后记下排序后数组的下标,依次输出
参考技术B

#include<stdio.h>

typedef struct
    char thread_name[3];
    unsigned int require_moment;
    unsigned int persist_time;
TEST_INFO;
TEST_INFO test_data[]=
"r1",0,3,
"r2",1,6,
"w1",3,5,
"r3",2,5,
"w2",5,5, 
"w3",4,5,
"r4",7,5,
"r5",9,5,
"w4",8,5,
"w5",12,5
;

int main()
    int i,j;
    for(i=0;i<10;i++)
        for(j=i+1;j<10;j++)
            if(test_data[i].require_moment>test_data[j].require_moment)
                TEST_INFO t=test_data[i];
                test_data[i]=test_data[j];
                test_data[j]=t;
            
        
    
    for(i=0;i<10;i++)
        printf("%s %d %d\\n",test_data[i].thread_name,test_data[i].require_moment,test_data[i].persist_time);
    

追问

这是冒泡排序吗?

追答

对,你也可以用其它排序方式,这个不影响结果

本回答被提问者采纳

以上是关于C语言 结构体如何排序的主要内容,如果未能解决你的问题,请参考以下文章

c语言中如何将按结构体中的某个元素大小,将结构体排序输出

C语言结构体排序

C语言结构体排序

用c语言给结构体中的元素排序

C语言如何返回结构体数组

c语言如何实现结构体的深度复制