哈希表的c语言(哈希表c++实现)

本篇文章给大家谈谈哈希表的c语言,以及哈希表c++实现对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

1、c语言问题 哈希表2、C语言哈希表3、C语言实现哈希表的相关运算算法 编写程序实现哈希表的构造过程。4、数据结构 哈希表,C语言解答

c语言问题 哈希表

这里的char **table; table相当于是指向一个char型的指针的指针

可以当作二维数组用,例如table[0][0] = ‘a’; 或者**table= ‘a’;

也可以当作一维的字符串数组用,如 table[0] =”hello”; 或者*table = “hello”;

哈希表的c语言(哈希表c++实现)

C语言哈希表

/#include “iostream.h”

#include iostream

#include “string.h”

#include “fstream”

#define NULL 0

unsigned int key;

unsigned int key2;

int *p;

struct node //建节点

{

char name[8],address[20];

char num[11];

node * next;

};

typedef node* pnode;

typedef node* mingzi;

node **phone;

node **nam;

node *a;

using namespace std; //使用名称空间

void hash(char num[11]) //哈希函数

{

int i = 3;

key=(int)num[2];

while(num[i]!=NULL)

{

key+=(int)num[i];

i++;

}

key=key%20;

}

void hash2(char name[8]) //哈希函数

{

int i = 1;

key2=(int)name[0];

while(name[i]!=NULL)

{

key2+=(int)name[i];

i++;

}

key2=key2%20;

}

node* input() //输入节点

{

node *temp;

temp = new node;

temp-next=NULL;

cout”输入姓名:”endl;

cintemp-name;

cout”输入地址:”endl;

cintemp-address;

cout”输入电话:”endl;

cintemp-num;

return temp;

}

int apend() //添加节点

{

node *newphone;

node *newname;

newphone=input();

newname=newphone;

newphone-next=NULL;

newname-next=NULL;

hash(newphone-num);

hash2(newname-name);

newphone-next = phone[key]-next;

phone[key]-next=newphone;

newname-next = nam[key2]-next;

nam[key2]-next=newname;

return 0;

}

void create() //新建节点

{

int i;

phone=new pnode[20];

for(i=0;i20;i++)

{

phone[i]=new node;

phone[i]-next=NULL;

}

}

void create2() //新建节点

{

int i;

nam=new mingzi[20];

for(i=0;i20;i++)

{

nam[i]=new node;

nam[i]-next=NULL;

}

}

void list() //显示列表

{

int i;

node *p;

for(i=0;i20;i++)

{

p=phone[i]-next;

while(p)

{

coutp-name’_’p-address’_’p-numendl;

p=p-next;

}

}

}

void list2() //显示列表

{

int i;

node *p;

for(i=0;i20;i++)

{

p=nam[i]-next;

while(p)

{

coutp-name’_’p-address’_’p-numendl;

p=p-next;

}

}

}

void find(char num[11]) //查找用户信息

{

hash(num);

node *q=phone[key]-next;

while(q!= NULL)

{

if(strcmp(num,q-num)==0)

break;

q=q-next;

}

if(q)

coutq-name”_” q-address”_”q-numendl;

else cout”无此记录”endl;

}

void find2(char name[8]) //查找用户信息

{

hash2(name);

node *q=nam[key2]-next;

while(q!= NULL)

{

if(strcmp(name,q-name)==0)

break;

q=q-next;

}

if(q)

coutq-name”_” q-address”_”q-numendl;

else cout”无此记录”endl;

}

void save() //保存用户信息

{

int i;

node *p;

for(i=0;i20;i++)

{

p=phone[i]-next;

while(p)

{

fstream iiout(“out.txt”, ios::out);

iioutp-name”_”p-address”_”p-numendl;

p=p-next;

}

}

}

void menu() //菜单

{

cout”0.添加记录”endl;

cout”3.查找记录”endl;

cout”2.姓名散列”endl;

cout”4.号码散列”endl;

cout”5.清空记录”endl;

cout”6.保存记录”endl;

cout”7.退出系统”endl;

}

int main()

{

char num[11];

char name[8];

create();

create2() ;

int sel;

while(1)

{

menu();

cinsel;

if(sel==3)

{ cout”9号码查询,8姓名查询”endl;

int b;

cinb;

if(b==9)

{ cout”请输入电话号码:”endl;

cin num;

cout”输出查找的信息:”endl;

find(num);

}

else

{ cout”请输入姓名:”endl;

cin name;

cout”输出查找的信息:”endl;

find2(name);}

}

if(sel==2)

{ cout”姓名散列结果:”endl;

list2();

}

if(sel==0)

{ cout”请输入要添加的内容:”endl;

apend();

}

if(sel==4)

{ cout”号码散列结果:”endl;

list();

}

if(sel==5)

{ cout”列表已清空:”endl;

create();

create2();

}

if(sel==6)

{ cout”通信录已保存:”endl;

save();

}

if(sel==7) return 0;

}

return 0;

}

C语言实现哈希表的相关运算算法 编写程序实现哈希表的构造过程。

#define MaxSize 100 //定义最大哈希表长度

#define NULLKEY -1 //定义空关键字值

#define DELKEY -2 //定义被删关键字值

typedef int KeyType; //关键字类型

typedef char * InfoType; //其他数据类型

typedef struct

{

KeyType key; //关键字域

InfoType data; //其他数据域

int count; //探查次数域

} HashData;

typedef HashData HashTable[MaxSize]; //哈希表类型

void InsertHT(HashTable ha,int n,KeyType k,int p) //将关键字k插入到哈希表中

{

int i,adr;

adr=k % p;

if (ha[adr].key==NULLKEY || ha[adr].key==DELKEY) //x[j]可以直接放在哈希表中

{

ha[adr].key=k;

ha[adr].count=1;

}

else //发生冲突时采用线性探查法解决冲突

{

i=1; //i记录x[j]发生冲突的次数

do

{

adr=(adr+1) % p;

i++;

}

while (ha[adr].key!=NULLKEY ha[adr].key!=DELKEY);

ha[adr].key=k;

ha[adr].count=i;

}

n++;

}

void CreateHT(HashTable ha,KeyType x[],int n,

数据结构 哈希表,C语言解答

#include stdio.h

#includemalloc.h

#includestring.h

//#include

#define HASH_LEN 50 //哈希表的长度

#define M 47

#define NAME_NO 30 //人名的个数

typedef struct NAME

{

char *py; //名字的拼音

int k; //拼音所对应的整数

}NAME;

NAME NameList[HASH_LEN];

typedef struct hterm //哈希表

{

char *py; //名字的拼音

int k; //拼音所对应的整数

int si; //查找长度

}HASH;

HASH HashList[HASH_LEN];

/*———————–姓名(结构体数组)初始化———————————*/

void InitNameList()

{ int i;

char *f;

int r,s0;

NameList[0].py=”chenghongxiu”;

NameList[1].py=”yuanhao”;

NameList[2].py=”yangyang”;

NameList[3].py=”zhanghen”;

NameList[4].py=”chenghongxiu”;

NameList[5].py=”xiaokai”;

NameList[6].py=”liupeng”;

NameList[7].py=”shenyonghai”;

NameList[8].py=”chengdaoquan”;

NameList[9].py=”ludaoqing”;

NameList[10].py=”gongyunxiang”;

NameList[11].py=”sunzhenxing”;

NameList[12].py=”sunrongfei”;

NameList[13].py=”sunminglong”;

NameList[14].py=”zhanghao”;

NameList[15].py=”tianmiao”;

NameList[16].py=”yaojianzhong”;

NameList[17].py=”yaojianqing”;

NameList[18].py=”yaojianhua”;

NameList[19].py=”yaohaifeng”;

NameList[20].py=”chengyanhao”;

NameList[21].py=”yaoqiufeng”;

NameList[22].py=”qianpengcheng”;

NameList[23].py=”yaohaifeng”;

NameList[24].py=”bianyan”;

NameList[25].py=”linglei”;

NameList[26].py=”fuzhonghui”;

NameList[27].py=”huanhaiyan”;

NameList[28].py=”liudianqin”;

NameList[29].py=”wangbinnian”;

for (i=0;iNAME_NO;i++)// *求出各个姓名的拼音所对应的整数

{

s0=0;

f=NameList[i].py;

for (r=0;*(f+r) != ‘\0’;r++) //方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字

s0=*(f+r)+s0;

NameList[i].k=s0;

}

}

/*———————–建立哈希表———————————*/

void CreateHashList()

{int i;

for ( i=0; iHASH_LEN;i++)//哈希表的初始化

{

HashList[i].py=””;

HashList[i].k=0;

HashList[i].si=0;

}

for (i=0; iNAME_NO;)

{

int sum=0;

int adr=(NameList[i].k) % M; //哈希函数

int d=adr;

if(HashList[adr].si==0) //如果不冲突

{

HashList[adr].k=NameList[i].k;

HashList[adr].py=NameList[i].py;

HashList[adr].si=1;

}

else //冲突

{

do

{

d=(d+((NameList[i].k))%10+1)%M; //伪散列

sum=sum+1; //查找次数加1

}while (HashList[d].k!=0);

HashList[d].k=NameList[i].k;

HashList[d].py=NameList[i].py;

HashList[d].si=sum+1;

}i++;

}

}

/*————————————-查找————————————*/

void FindList()

{ int r;

char name[20]={0};

int s0=0;

int sum=1;

int adr;

int d;

printf(“\n\n请输入姓名的拼音: “); //输入姓名

scanf(“%s”,name);

for ( r=0;r20;r++) //求出姓名的拼音所对应的整数(关键字)

s0+=name[r];

adr=s0 % M; //使用哈希函数

d=adr;

if(HashList[adr].k==s0) //分3种情况进行判断

printf(“\n姓名:%s 关键字:%d 查找长度为: 1”,HashList[d].py,s0);

else if (HashList[adr].k==0)

printf(“无该记录!”);

else

{

int g=0;

do

{

d=(d+s0%10+1)%M; //伪散列

sum=sum+1;

if (HashList[d].k==0)

{

printf(“无记录! “);

g=1;

}

if (HashList[d].k==s0)

{

printf(“\n姓名:%s 关键字:%d 查找长度为:%d”,HashList[d].py,s0,sum);

g=1;

}

}while(g==0);

}

}

/*——————————–显示哈希表—————————-*/

void Display()

{int i;

float average=0;

printf(“\n\n地址\t关键字\t\t搜索长度\tH(key)\t\t拼音 \n”); //显示的格式

for( i=0; i15; i++)

{

printf(“%d “,i);

printf(“\t%d “,HashList[i].k);

printf(“\t\t%d “,HashList[i].si);

printf(“\t\t%d “,(HashList[i].k)%M);

printf(“\t %s “,HashList[i].py);

printf(“\n”);

}

// printf(“按任意键继续显示…\n”); //由于数据比较多,所以分屏显示(以便在Win9x/DOS下能看到所有的数据)

// getch();

for( i=15; i30; i++)

{

printf(“%d “,i);

printf(“\t%d “,HashList[i].k);

printf(“\t\t%d “,HashList[i].si);

printf(“\t\t%d “,(HashList[i].k)%M);

printf(“\t %s “,HashList[i].py);

printf(“\n”);

}

// printf(“按任意键继续显示…\n”);

// getch();

for( i=30; i40; i++)

{

printf(“%d “,i);

printf(“\t%d “,HashList[i].k);

printf(“\t\t%d “,HashList[i].si);

printf(“\t\t%d “,(HashList[i].k)%M);

printf(“\t %s “,HashList[i].py);

printf(“\n”);

}

//printf(“按任意键继续显示…\n”);

//getch();

for( i=40; i50; i++)

{

printf(“%d “,i);

printf(“\t%d “,HashList[i].k);

printf(“\t\t%d “,HashList[i].si);

printf(“\t\t%d “,(HashList[i].k)%M);

printf(“\t %s “,HashList[i].py);

printf(“\n”);

}

for (i=0;iHASH_LEN;i++)

{average+=HashList[i].si;

average/=NAME_NO;

printf(“\n\n平均查找长度:ASL(%d)=%f \n\n”,NAME_NO,average);

}

}

/*——————————–主函数—————————-*/

void main()

{

/* ::SetConsoleTitle(“哈希表操作”); //Windows API函数,设置控制台窗口的标题

HANDLE hCon = ::GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出设备的句柄

::SetConsoleTextAttribute(hCon, 10|0); //设置文本颜色

*/

printf(“\n————————哈希表的建立和查找———————-“);

InitNameList();

CreateHashList ();

while(1)

{ char ch1;

printf(“\n\n”);

printf(” 1. 显示哈希表\n”);

printf(” 2. 查找\n”);

printf(” 3. 退出\n”);

err:

scanf(“%c”,ch1);

if (ch1==’1′)

Display();

else if (ch1==’2′)

FindList();

else if (ch1==’3′)

return;

else

{

printf(“\n请输入正确的选择!”);

goto err;

}

}

}

哈希表的c语言的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于哈希表c++实现、哈希表的c语言的信息别忘了在本站进行查找喔。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年4月1日 02:50:31
下一篇 2024年4月1日 02:57:51

相关推荐

  • c语言改写模式,c语言实现修改功能

    c语言程序修改? 1、这个程序有4个错误,我都加粗了,第一个是m没有赋初值,第二个是while表达式中的ch=getchar()需要括号括起来,第三个是m=m*10+ch-0中的0也需要用单引号括起来,第四个是第2个while中为m!=0。 2、define容易造成误会,因为不符合一般的编程习惯,false 0, true 1;scanf放在你的那个地方是达…

    2024年5月23日
    3900
  • c语言控制代码的换码序列,c语言交换代码

    求C语言编程大神解答一下下面这个编程代码? k==5,用5去除125余0,所以r=125%5中r为0。由于!0为1,所以执行while循环体:先打印出5(k的值),再n=n/k==125/5=25;由于251则再打印出*号。这一循环结果输出是5*。 下面是我的代码,三个函数分别对应三个问题。 在实现基本要求的前提下,拓展了可以从键盘输入的功能,以下为各题代码…

    2024年5月23日
    5600
  • c语言扫描io脚状态,c语言端口扫描

    求51单片机的上升沿和下降沿C语言检测程序列子,端口就是普通IO口。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。 单片机怎么计算1s内下降沿的个数的C语言程序或者计算两个下降沿的时间(检测脉冲频率)计算1s内下降沿的个数方法是,一个定时器设置定时1…

    2024年5月23日
    4400
  • c语言mallloc使用的简单介绍

    C语言中使用malloc必须加#includemallo.h? 1、在C语言中使用malloc函数进行动态内存分配。malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void malloc(unsigned int num_bytes);功能:分配长度为num_bytes字节的内存块。 2、你可以看一下C语言那本…

    2024年5月23日
    4400
  • c语言三位小数,C语言三位小数

    怎样用C++语言输出精确到小数点后三位的数? 1、用C++语言输出精确到小数点后三位的数,可以参考下面给出的代码:coutsetiosflags(ios:fixed)setprecision(3)。其中 setiosflags中set是设置的意思。ios是iostream的缩写,即输入输出流。flags是标志的意思。 2、要精确到小数点后若干位,则数据类型为…

    2024年5月23日
    7300
  • c语言21点游戏,二十一点游戏代码c语言

    如何使用C语言编写简单小游戏? 1、数学知识:长方形的面积S=a*b 长方形周长L=2*(a+b)其中a b分别为长方形的宽和高。算法分析:长方形面积及周长均依赖于宽和高,所以先要输入宽高值,然后根据公式计算,输出结果即可。 2、/*也不知道你是什么级别的,我是一个新手,刚接触编程语言,以下是我自己变得一个小程序,在所有c语言的编译器(vc++0、turbo…

    2024年5月23日
    6400
  • c语言当中的null,C语言当中的符号

    C/C++中,NULL和null的区别是什么? nul 和 null要看编译器,不同的编译器有所区别。 所以C或者C++中都使用一个特殊定义NULL表示无效值,其本质就是未定义具体数据类型的0值。 null是是什么都没有的意思。在java中表示空对象。 本意是“空的;元素只有零的”意思。计算机中通常表示空值,无结果,或是空集合。\x0d\x0a在ASCII码…

    2024年5月23日
    4500
  • 包含c语言对txt文件命名的词条

    如何在C语言编程里面修改源文件名字 如果你是在WINDOWS的话,简单了,随便用个编辑器,比如记事本,然后写c源程序,保存到你想要保存的位置。如果你在DOS下,可以用edit,写好以后,按alt键,选择文件菜单,然后保存。 用open打开文件,注意操作模式使用“修改”或者“添加” 用write或者fprintf向文件中写入你的内容。 用close关闭文件。 …

    2024年5月23日
    4900
  • 学c语言编程,学c语言编程用什么软件

    编程开发必须要学C语言吗? 1、要学习。编程开发的学习内容主要包括c语言、python和c+语言。C语言作为一种简单灵活的高级编程语言,它是一个面向过程的语言,一般是作为计算机专业的基础入门语言课程。 2、C语言。对于刚接触编程的人来说,先学习C语言是非常重要的。C语言可以说是是计算机编程语言的鼻祖,其他的编程语言几乎全是由C语言变化衍生出来的。 3、不需要…

    2024年5月23日
    3500
  • c语言用string定义字符串,c语言中用string类型来处理字符串类型

    C++怎样定义定义字符串 1、第一是字符数组来表示字符串。用下面的语句声明:char a[10];C语言中字符数组与字符串的唯一区别是字符串末尾有一个结束符\0,而字符数组不需要。 2、在C中定义字符串有下列几种形式:字符串常量,char数组,char指针 字符串常量 即:位于一对双括号中的任何字符。双引号里的字符加上编译器自动提供的结束标志\0字符,作为 …

    2024年5月23日
    4300

发表回复

登录后才能评论



关注微信