// 使用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.