使用qsort排序结构体数组,使用bsearch查询结构体数组

// 使用qsort排序结构体数组,使用bsearch查询结构体数组

//函数名:qsort
//功  能:使用快速排序例程进行排序
//头文件:stdlib.h
//用  法:void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
//参  数:
//  1 待排序数组首地址
//  2 数组中待排序元素数量
//  3 各元素的占用空间大小
//  4 指向函数的指针,用于确定排序的顺序

//函数名: bsearch
//功  能: 二分法搜索
//头文件:stdlib.h
//用  法: void *bsearch(const void *key, const void *base, size_t nelem, size_t width, int(*fcmp)(const void *, const *));
//参  数:
//  第一个:要查找的关键字。
//  第二个:要查找的数组。
//  第三个:指定数组中元素的数目。
//  第四个:每个元素的长度(以字符为单位)。
//  第五个:指向比较函数的指针。

//使用qsort()排序并用 bsearch()搜索是一个比较常用的组合,使用方便快捷。

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

// 结构体定义
typedef struct {
	char szStartTime[20];// 开始时间
	char szEndTime[20];  // 结束时间
	int  nId;            // ID号
	char szContent[20];  // 内容
}ST_SORT_CONTENT;

// 排序比较函数
int CompareContent(const void *data1, const void *data2)
{
	ST_SORT_CONTENT *pContent1 = (ST_SORT_CONTENT *)data1;
	ST_SORT_CONTENT *pContent2 = (ST_SORT_CONTENT *)data2;
	// 按开始时间、结束时间、ID号进行比较排序
	int nRet = strncmp(pContent1->szStartTime, pContent2->szStartTime, 
		sizeof(pContent1->szStartTime));
	if(nRet == 0)
	{
		nRet = strncmp(pContent1->szEndTime, pContent2->szEndTime, 
			sizeof(pContent1->szEndTime));
		if(nRet == 0)
		{
			nRet = pContent1->nId - pContent2->nId;
		}
	}
	return nRet;
}

// 主函数
int main(int argc, char *argv[])
{
	ST_SORT_CONTENT szContent[6];
	memset(szContent, 0, sizeof(szContent));
	int nIdx = 0;

	// make test data
	strncpy(szContent[nIdx].szStartTime, "2013-11-11 11:11:11", 20);
	strncpy(szContent[nIdx].szEndTime, "2013-11-11 12:12:12", 20);
	szContent[nIdx].nId = 1;
	strncpy(szContent[nIdx].szContent, "6", sizeof(szContent[nIdx].szContent));
	nIdx++;
	strncpy(szContent[nIdx].szStartTime, "2013-11-11 11:11:11", 20);
	strncpy(szContent[nIdx].szEndTime, "2013-11-11 12:12:12", 20);
	szContent[nIdx].nId = 0;
	strncpy(szContent[nIdx].szContent, "5", sizeof(szContent[nIdx].szContent));
	nIdx++;
	strncpy(szContent[nIdx].szStartTime, "2013-11-11 10:10:10", 20);
	strncpy(szContent[nIdx].szEndTime, "2013-11-11 11:11:11", 20);
	szContent[nIdx].nId = 1;
	strncpy(szContent[nIdx].szContent, "4", sizeof(szContent[nIdx].szContent));
	nIdx++;
	strncpy(szContent[nIdx].szStartTime, "2013-11-11 10:10:10", 20);
	strncpy(szContent[nIdx].szEndTime, "2013-11-11 11:11:11", 20);
	szContent[nIdx].nId = 0;
	strncpy(szContent[nIdx].szContent, "3", sizeof(szContent[nIdx].szContent));
	nIdx++;
	strncpy(szContent[nIdx].szStartTime, "2013-11-11 09:09:09", 20);
	strncpy(szContent[nIdx].szEndTime, "2013-11-11 10:10:10", 20);
	szContent[nIdx].nId = 1;
	strncpy(szContent[nIdx].szContent, "2", sizeof(szContent[nIdx].szContent));
	nIdx++;
	strncpy(szContent[nIdx].szStartTime, "2013-11-11 09:09:09", 20);
	strncpy(szContent[nIdx].szEndTime, "2013-11-11 10:10:10", 20);
	szContent[nIdx].nId = 0;
	strncpy(szContent[nIdx].szContent, "1", sizeof(szContent[nIdx].szContent));
	nIdx++;

	printf("printf content before sort.\n");
	for(int i = 0; i < 6; i++)
	{
		printf("[%s] [%s] [%d] [%s]\n", 
			szContent[i].szStartTime, szContent[i].szEndTime, 
			szContent[i].nId, szContent[i].szContent);
	}
	printf("\n");

	// 使用qsort排序
	qsort(szContent, 6, sizeof(ST_SORT_CONTENT), CompareContent);

	printf("printf content after sort.\n");
	for(int i = 0; i < 6; i++)
	{
		printf("[%s] [%s] [%d] [%s]\n", 
			szContent[i].szStartTime, szContent[i].szEndTime, 
			szContent[i].nId, szContent[i].szContent);
	}
	printf("\n");

	printf("use bsearch search content.\n");
	// 设置key的内容
	ST_SORT_CONTENT stKey;
	memset(&stKey, 0, sizeof(ST_SORT_CONTENT));
	strncpy(stKey.szStartTime, "2013-11-11 09:09:09", sizeof(stKey.szStartTime));
	strncpy(stKey.szEndTime, "2013-11-11 10:10:10", sizeof(stKey.szEndTime));
	stKey.nId = 1;
	printf("[%s] [%s] [%d]key.\n", stKey.szStartTime, stKey.szEndTime, stKey.nId);
	// 查找key对应的内容
	ST_SORT_CONTENT *pResult = (ST_SORT_CONTENT *)bsearch(
		&stKey, szContent, 6, sizeof(ST_SORT_CONTENT), CompareContent);
	if(NULL == pResult)
	{
		printf("[%s] [%s] [%d]not found.\n", 
			stKey.szStartTime, stKey.szEndTime, stKey.nId);
	}
	else
	{
		printf("[%s] [%s] [%d] [%s] found.\n", 
			pResult->szStartTime, pResult->szEndTime, 
			pResult->nId, pResult->szContent);
	}
	system("PAUSE");
}

 


// 结果输出
//printf content before sort.
//[2013-11-11 11:11:11] [2013-11-11 12:12:12] [1] [6]
//[2013-11-11 11:11:11] [2013-11-11 12:12:12] [0] [5]
//[2013-11-11 10:10:10] [2013-11-11 11:11:11] [1] [4]
//[2013-11-11 10:10:10] [2013-11-11 11:11:11] [0] [3]
//[2013-11-11 09:09:09] [2013-11-11 10:10:10] [1] [2]
//[2013-11-11 09:09:09] [2013-11-11 10:10:10] [0] [1]
//
//printf content after sort.
//[2013-11-11 09:09:09] [2013-11-11 10:10:10] [0] [1]
//[2013-11-11 09:09:09] [2013-11-11 10:10:10] [1] [2]
//[2013-11-11 10:10:10] [2013-11-11 11:11:11] [0] [3]
//[2013-11-11 10:10:10] [2013-11-11 11:11:11] [1] [4]
//[2013-11-11 11:11:11] [2013-11-11 12:12:12] [0] [5]
//[2013-11-11 11:11:11] [2013-11-11 12:12:12] [1] [6]
//
//use bsearch search content.
//[2013-11-11 09:09:09] [2013-11-11 10:10:10] [1]key.
//[2013-11-11 09:09:09] [2013-11-11 10:10:10] [1] [2] found.

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值