数据结构笔记四-1 (20120826)

数据结构笔记四-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]# 

*******************************************************************************



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值