当前位置:首页 » 编程语言 » 散列查找c语言简单
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

散列查找c语言简单

发布时间: 2023-06-28 04:28:57

A. c语言题要求实现一个在数组中查找指定元素的简单函数。(找错误)

改错参考如下:
int search(int list[],int n,int x)
{
int i,index=-1;
for(i=0;i<n;i++)
if(list[i]==x){//注意是==
index=i;//既然都明白下标从0开始,有必要+1吗?
break;
}
return index;//不返回值行吗?
}

B. C语言 运用散列函数拼写检查

可以考虑建一个桶式的散列表,表的主体结构是个长为26*27的指针数组,每个指针分别指向一个子链表,每个链表分别存放开头为a,aa,ab,ac......g,ga,gb,......zy,zz为单词.(不区分大小写)
这样的话,假设单词存放在字符串str中,则散列函数就是
h(str)=(str[0]-'A')*27+str[1]-'A'

从题目给的散列函数就可以明显看出,散列表肯定要用长度为HASHSIZE的数组啊,你的链表设想肯定不符合题目要求

C. C语言编程,求字符串的hash值(散列值)

#include<stdio.h>

intmain(){
chars[256];
char*p;
unsignedlonglonginth=0;

scanf("%s",s);
for(p=s;*p;p++){
h=h*31+*p;
}
printf("%llu",h);
}

D. 简单c语言编程题

根据题意,程序分三个主要功能:1、从数组中查找一个整数。2、向数组插入一个整数。3、数组升序排列。

一、其中查找功能,数组无序或升序对应二种写法(直接遍历比较、二分法)。

对于升序数组用二分法查找更快(本案例只有10个数,如数字量大则效果更明显)。

二、数组插入功能,将插入位置及其往后的元素均后移一位(数组大小需多预留1位)。

另外:重复的代码段要写成独立函数,避免代码冗余。

下面是代码(数值我用的随机数填充,你想手动输入自添scanf函数):

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define M 10//最大整数个数

void input(int nums[],int len);//输入

void showNum(int nums[],int len);// 打印数组

void px(int nums[],int len);//排序

int checkNum(int nums[],int len,int n);//检查n是否存在于无序数组num,是返回下标,否将n插入数组并返回-1。

int checkNumPX(int nums[],int len,int n);//检查n是否存在于升序数组num,是返回下标,否将n插入对应位置并返回-1。

void move1(int nums[],int len,int inx);//从下标inx开始的元素,全部往后移动1位(inx下标空出来给插入)

int main()

{

int nums[M+1],len=M+1,inx,n;//预留一位给插入

srand(time(NULL));

input(nums,len-1);

showNum(nums,len-1);

printf("请输入要查找的数n:"),scanf("%d",&n);

inx=checkNum(nums,len-1,n);

if(inx!=-1) printf("存在!下标是%d ",inx);

if(inx==-1) printf("不存在!已在数组末尾插入,插入后的数组为: "),showNum(nums,len);

printf(" -----------------------下面是问题2------------------------------- ");

input(nums,len-1);

px(nums,len);

showNum(nums,len-1);

printf("请输入要查找的数n:"),scanf("%d",&n);

inx=checkNumPX(nums,len-1,n);

if(inx!=-1) printf("存在!下标是%d ",inx);

if(inx==-1) printf("不存在!已在插入数组对应的位置 "),showNum(nums,len);

return 0;

}

void input(int nums[],int len)

{

int i;

for(i=0,printf("生成%d个2位随机整数...... ",len);i<len;nums[i]=rand()%90+10,i++);//10~99随机数

}

void showNum(int nums[],int len)

{

int i;

for(i=0,printf("当前数组元素为: ");i<len;printf("%d ",nums[i]),i++);

printf(" ");

}

void px(int nums[],int len)

{

int i,j;

for(i=0,printf("对数组进行升序排序...... ");i<len;i++)

for(j=i+1;j<len;j++)

if(nums[i]>nums[j]) nums[i]^=nums[j],nums[j]^=nums[i],nums[i]^=nums[j];

}

int checkNum(int nums[],int len,int n)

{

int i;

for(i=0,printf("数组中按元素顺序查找%d...... ",n);i<len;i++)

if(nums[i]==n) return i;

if(i==len) nums[len]=n;

return -1;

}

int checkNumPX(int nums[],int len,int n)

{

int bInx=0,eInx=len-1,mInx;

printf("对升序数组按二分法查找%d...... ",n);

while(eInx-bInx>1)//当序列区间元素大于2个时,取中间值

{

mInx=bInx+(eInx-bInx)/2;

if(nums[mInx]==n) return mInx;

if(n<nums[mInx]) eInx=mInx;//n比中间值小,取前半区间中间继续比较

if(n>nums[mInx]) bInx=mInx;//n比中间值大,取后半区间中间继续比较

}

if(nums[eInx]==n) return eInx;

if(nums[bInx]==n) return bInx;

if(n<nums[bInx]) move1(nums,len+1,bInx),nums[bInx]=n;

if(n>nums[bInx] && n<nums[eInx]) move1(nums,len+1,eInx),nums[eInx]=n;

if(n>nums[eInx]) move1(nums,len+1,eInx+1),nums[eInx+1]=n;

return -1;

}

void move1(int nums[],int len,int inx)

{

int i;

for(i=len-1;i>inx;nums[i]=nums[i-1],i--);

}