linux中C语言函数:数据结构函数(二分查找、二叉树、哈希表、线性搜索)
来源:互联网 发布:淘宝一百多的狩猎者 编辑:程序博客网 时间:2024/06/09 22:07
1. qsort 、bsearch
包含头文件:#include<stdlib.h>
void qsort(void *base , size_t nmemb , size_t size,
int(*comopare)(const void*elem1,const void *elem2))
void *bsearch(const void*key , const void*base , siez_t nmemb , size_t size,
int(*compare)(const void*elem1,const void*elem2))
#include<stdio.h>#include<string.h>#include<stdlib.h>int compar(const void* elem1,const void* elem2){//将elem1,elem2转换为指向指针的指针,再取址return strcmp(*(char**)elem1,*(char**)elem2);}int main(){//指针数组char *pBase[] = {"c++","php","java","perl","c","ruby","python"};int num = 7;int i;char *key = "c++";char **result;//快速排序qsort(pBase,num,sizeof(char*),compar);for (i=0;i<num;i++){printf("%s ",pBase[i]);}printf("\n");//二分查找前必须排序result = (char**)bsearch(&key,pBase,num,sizeof(char*),compar);if (result==NULL){printf("%s not found\n",key);}else{printf("%s was found\n",*result);}return 0;}/*运行结果: c c++ java perl php python rubyc++ was found*/
2. lsearch 、 lfind
包含头文件<stdlib.h>
void lsearch(const void*key , const void*base , size_t *nmemb , size_t *size,
int(*compare)(const void*elem1,const void*elem2))
void lfind(const void*key , const void*base , size_t *nmemb , size_t *size,
int(*compare)(const void*elem1,const void*elem2))
#include<stdio.h>#include<string.h>#include<stdlib.h>int compar(const void* elem1,const void* elem2){//将elem1,elem2转换为指向指针的指针,再取址return strcmp(*(char**)elem1,*(char**)elem2);}int main(){//指针数组,由于lsearch找不到元素时,会插入该数据,所以需要数组够大char *pBase[10] = {"c++","php","java","perl","c","ruby","python"};int num = 7;int i;char *key = "c++";char *key1 = "hello";char **result;for (i=0;i<num;i++){printf("%s ",pBase[i]);}printf("\n");//线性搜索result = (char**)lfind(&key,pBase,&num,sizeof(char*),compar);//传入的是key的地址if (result==NULL){printf("%s not found\n",key);}else{printf("%s was found\n",*result);}for (i=0;i<num;i++){printf("%s ",pBase[i]);}printf("\n");//线性搜索result = NULL;result = (char**)lsearch(&key1,pBase,&num,sizeof(char*),compar);//lsearch如果找到数据,则返回数据地址,否则返回数组base的地址,这跟其他不同if (!strcmp(*result,"hello")){printf("%s not found\n",key1);}else{printf("%s was found\n",*result);}//与lfind不同,lsearch会将不存在的元素插入到数组中再返回i = 0;while(pBase[i]){printf("%s ",pBase[i++]);}printf("\n");return 0;}/*运行结果: c++ php java perl c ruby python c++ was foundc++ php java perl c ruby python hello not foundc++ php java perl c ruby python hello */
3. hcreate 、hdestroy 、hearch
包含头文件<search.h>
int hcreate(size_t nel);
void hdestory();
ENTRY *hsearch(ENRTY item,ACTION aciotn);
typedef struct entry
{
char *key;
char *data;
}ENTRY;
aciotn有两个值FIND和ENTER
#include<stdio.h>#include<string.h>#include<stdlib.h>#include <search.h>typedef struct student{int age;int grade;}stu;int main(){int res = 0;//建立一个容量为100的哈希表res = hcreate(100);if (NULL == res){printf("can not create hashtable\n");return 1;}ENTRY item;stu s[] = { {20,100} , {25,60} , {22,80} };;//插入一个数据(key=001,data=stu(20,100))item.key = "001";//keyitem.data = (void*)&s[0];hsearch(item,ENTER);item.key = "002";//keyitem.data = (void*)&s[1];hsearch(item,ENTER);item.key = "002";//keyitem.data = (void*)&s[2];hsearch(item,ENTER);//查找key为001的元素ENTRY *pEntry;item.key = "001";pEntry = hsearch(item,FIND);if (pEntry!=NULL){printf("find student key %s : %d %d\n",pEntry->key,((stu*)pEntry->data)->age,((stu*)pEntry->data)->grade);}else{printf("can not find\n");}//销毁哈希表hdestroy();return 0;}/*运行结果: find student key 001 : 20 100*/
4. tdelete 、tfind、tsearch、twalk
包含头文件<search.h>
void *tdelete(const void*key,void **rootp,int(*cmpar)(const void *a,const void*b))
void *tfind(const void*key,void **rootp,int(*cmpar)(const void *a,const void*b))
void *tsearch(const void*key,void **rootp,int(*cmpar)(const void *a,const void*b))
void twalk(const void*root,void(*action)(void *nodep,VISIT which,int depth))
#include<search.h>#include<stdlib.h>#include<stdio.h>//比较函数int compare(const void*a,const void*b){if (*(int*)a < *(int*)b){return -1;}else if (*(int*)a > *(int*)b){return 1;}elsereturn 0;}//遍历的aciotn函数void action(const void *nodep,const VISIT which,const int depth){int *datap;switch(which){case preorder://中序遍历,postorder前序遍历,endorder后序遍历datap = *(int**)nodep;printf("%d ",*datap);break;case leaf:datap = *(int**)nodep;printf("%d ",*datap);break;default:break;}}int main(){int i = 0;int data[5] = {3,2,4,1,5};int *p = data;void *root = NULL;void *val;/*tsearch函数:如果rootp为NULL,则插入当前节点。如果rootp不为NULL,利用compare进行比较,如果相同则返回指向其父节点的指针否则将当前节点加入树中,返回指向该节点在树中的位置*/for (i=0;i<5;i++){//插入元素val = tsearch(p,&root,compare);if (val==NULL){printf("insert data fail");exit(1);}p++;}//树的遍历twalk(root,action);printf("\n");val = tfind(p,&root,compare);if (val==NULL){printf("can not find the node %d\n",*p);}else{printf("find the node %d\n",**(int**)val);//注意:树存储的节点是指向int型指针的指针,int**}//是p指向二叉树中不存在的节点p++;val = tfind(p,&root,compare);if (val==NULL){printf("can not find the node %d\n",*p);}else{printf("find the node %d\n",**(int**)val);}//删除节点1p = data;val = tdelete(p,&root,compare);if (val==NULL){printf("can not find the node %d\n",*p);} else{printf("the parent node's value is %d\n",**(int**)val);}return 0;}/*运行结果:3 2 1 4 5 find the node 5can not find the node -1079222440the parent node's value is 4*/
- linux中C语言函数:数据结构函数(二分查找、二叉树、哈希表、线性搜索)
- 【C语言】编写函数实现二分查找
- 数据结构:二叉查找树(C语言实现)
- C语言基本数据结构之四(线性,对分,二叉树查找及二叉树删除)
- 二分查找、二叉搜索
- c语言数据结构线性表之顺序表功能函数
- C语言数据结构——数据结构有序二叉树的函数实现
- C语言实现的线性查找和二分查找
- c语言数据结构之二叉(查找)树
- 数据结构——二叉查找树(C语言)
- 数据结构:二分查找与二叉树
- C语言:编写查找和排序函数(二分查找,冒泡排序,选择排序法)
- C语言字符串查找函数
- c语言中的搜索函数
- C语言-数据结构-线性表检索和二分检索
- C语言二叉搜索树
- C语言实现二叉查找树(搜索树)的创建,插入,查找,删除
- 二叉查找树 - C语言实现(摘自数据结构与算法分析 C语言描述)
- 同一段代码,不同C编译器,输出结果真的会不同啊!!!
- linux kernel怎么编译单独某个模块
- 带分数
- 关于java中参数传递的几点疑惑
- 串匹配-朴素(brute force)算法
- linux中C语言函数:数据结构函数(二分查找、二叉树、哈希表、线性搜索)
- MySQL 常用命令的使用
- secureCRT中的vi显示多颜色
- Spinner的一些用法
- 文件传输服务器(43)
- 软件开发流程
- C语言中跳出多重循环
- java学习:eclipse + Weblogic 12c + svn 集成开发环境搭建
- NYOJ-74-小学生算术-2013年08月16日00:44:54