数据结构笔记四-1 (20120826)
FAQ:
1.链表每个结点是数组,函数或者是文件等等;2.哈西表也可以是链表实现,查找到的是指针,这个指针用来操作其他的实现;
******************************
程序说明:
1.c:利用尾函数递归来实现折半查找以及利用循环来实现折半查找,注意:是对已经有序的序列进行查找;
2.c:哈希表的创建和查找;
3.c:使用链表来实现含哈西表的创建和查找;
堆排序找前几位的几个大值,效率很高;
一.查找:
还有二叉查找树没讲,和二叉树一起讲。
1.折半查找:
2.散列表:哈西表,杂催表:
哈希值:
1.给的数组能产生一组如下的数组:
int data2[]={10,21,42,23,74,45,66,87,58,49};
主要是个位上是从0到9这个十个数字。
2.希望哈希值能代表唯一的一个数;
1)选取一个hash函数:
既要保证方便计算,而且要减少冲突.
如果有冲突,解决冲突是关键.
解决方法:
1)开放地址法:线性探测法.
//如何构建散列表:先构建,再查找.
3.创建链表的含系表:
memset
1.c:利用尾函数递归来实现折半查找以及利用循环来实现折半查找,注意:是对已经有序的序列进行查找;
/*
*
*wuxiuwen
*利用尾函数递归来实现折半查找以及利用循环来实现折半查找,
*注意:是对已经有序的序列进行查找;
*/
#include<stdio.h>
//r如果有相同数据的情况下,结果不固定
void b_search(int data[],int ,int,int);
int main()
{
int a[]={5,7,12,25,34,37,43,46,58,80,92,105};
int len=sizeof(a)/sizeof(a[0]);
int i,j;
for(i=0;i<len;i++)
{
printf("%d ",a[i]);
}
printf("\n");
printf("请输入要查找的数:\n");
scanf("%d",&j);
b_search(a,0,len-1,j);
return 0;
}
/*利用函数递归调用来实现,但是资源占用太多
void b_search(int a[],int left,int right,int key)
{
int mid=(left+right)/2;
if(left > right)
{
printf("没有这个数\n");
return;
}
if(a[mid] == key)
{
printf("%d:%d\n",mid+1,key);
return;
}
if(a[mid]>key)
{
b_search(a,left,mid-1,key);
}
else
{
b_search(a,mid+1,right,key);
}
}
*/
//利用循环来进行实现
void b_search(int data[],int left,int right,int key)
{
int mid = (left+right)/2;
while(left <= right && data[mid] != key)
{
if(data[mid] == key)
break;
if(data[mid] > key)
right = mid -1;
else
left = mid+1;
mid = (left +right)/2;
}
if(left > right)
{
printf("没有这个数\n");
return;
}
if(data[mid] == key)
{
printf("%d:%d\n",mid+1,key);
return;
}
}
执行结果:
[root@localhost 查找]# gcc 1.c
[root@localhost 查找]# ./a.out
5 7 12 25 34 37 43 46 58 80 92 105
请输入要查找的数:
3
没有这个数
[root@localhost 查找]# ./a.out
5 7 12 25 34 37 43 46 58 80 92 105
请输入要查找的数:
34
5:34
[root@localhost 查找]#
*************************hash表实现查找******************************************************
有一个mian文件2.c,一个hash.c,还有一个头文件hash.h,具体如下:
———————————2.c:———————————————
/*
*wuxiuwen
*20120826
*哈希表的创建和查找;
*
*/
#include<stdio.h>
#include"hash.h"
int main()
{
int data1[]={2,232,4435,4,8,459,87,66,42,12};
int *p=NULL;
int key;
int i;
int len=sizeof(data1)/sizeof(data1[0]);
p = creathash(data1,len);
output (p,len);
printf("请输入要查找的数字:\n");
scanf("%d",&key);
i= search(p,key);
printf("位置为:%d\n",i);
return 0;
}
———————————hash.h—————————————
int * creathash(int [],int);
int search(int [],int);
int *freehash(int *);
———————————hash.c——————————————
#include<stdio.h>
#include<stdlib.h>
#include"hash.h"
#define MAXHASH 32726
static int d =1;
int *freehash(int *b)
{
free(b);
return NULL;
}
static int hashfun(int key)
{
return key%7;
}
static int hashsearch(int key)
{
if(d>10)
return -1;
return (hashfun(key)+d++)%10;
}
int * creathash(int a[],int len)
{
int *b;
int k;
b = (int *)malloc(sizeof(int)*len);
int i;
for(i=0;i<len;i++)
{
b[i]= MAXHASH;
}
for(i=0;i<len;i++)
{
k=hashfun(a[i]);
while(b[k] !=MAXHASH)
{
k = hashsearch(a[i]);
}
b[k]=a[i];
d=1;
}
return b;
}
int search(int b[],int key)
{
int k;
k = hashfun(key);
while(b[k] !=key)
{
k= hashsearch(key);
if(k ==-1)
{
printf("没有这个数.\n");
break ;
}
}
return k;
}
void output(int data[],int len)
{
int i;
for(i=0;i<len;i++)
{
printf("%d ",data[i]);
}
printf("\n");
}
———————————执行结果————————————
[root@localhost 2_hash]# gcc 2.c hash.c
[root@localhost 2_hash]# ./a.out
42 232 2 8 4435 4 459 87 66 12
请输入要查找的数字:
44
没有这个数.
位置为:-1
[root@localhost 2_hash]# ./a.out
42 232 2 8 4435 4 459 87 66 12
请输入要查找的数字:
8
位置为:3
[root@localhost 2_hash]#
*******************************************************************************