當前位置:首頁 » 編程語言 » 散列查找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--);

}