数据结构二叉排序树 哈希表.docx

上传人:b****3 文档编号:4751767 上传时间:2023-05-07 格式:DOCX 页数:24 大小:67.55KB
下载 相关 举报
数据结构二叉排序树 哈希表.docx_第1页
第1页 / 共24页
数据结构二叉排序树 哈希表.docx_第2页
第2页 / 共24页
数据结构二叉排序树 哈希表.docx_第3页
第3页 / 共24页
数据结构二叉排序树 哈希表.docx_第4页
第4页 / 共24页
数据结构二叉排序树 哈希表.docx_第5页
第5页 / 共24页
数据结构二叉排序树 哈希表.docx_第6页
第6页 / 共24页
数据结构二叉排序树 哈希表.docx_第7页
第7页 / 共24页
数据结构二叉排序树 哈希表.docx_第8页
第8页 / 共24页
数据结构二叉排序树 哈希表.docx_第9页
第9页 / 共24页
数据结构二叉排序树 哈希表.docx_第10页
第10页 / 共24页
数据结构二叉排序树 哈希表.docx_第11页
第11页 / 共24页
数据结构二叉排序树 哈希表.docx_第12页
第12页 / 共24页
数据结构二叉排序树 哈希表.docx_第13页
第13页 / 共24页
数据结构二叉排序树 哈希表.docx_第14页
第14页 / 共24页
数据结构二叉排序树 哈希表.docx_第15页
第15页 / 共24页
数据结构二叉排序树 哈希表.docx_第16页
第16页 / 共24页
数据结构二叉排序树 哈希表.docx_第17页
第17页 / 共24页
数据结构二叉排序树 哈希表.docx_第18页
第18页 / 共24页
数据结构二叉排序树 哈希表.docx_第19页
第19页 / 共24页
数据结构二叉排序树 哈希表.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构二叉排序树 哈希表.docx

《数据结构二叉排序树 哈希表.docx》由会员分享,可在线阅读,更多相关《数据结构二叉排序树 哈希表.docx(24页珍藏版)》请在冰点文库上搜索。

数据结构二叉排序树 哈希表.docx

数据结构二叉排序树哈希表

 

数据结构

实验报告

 

实验内容:

排序二叉树,及哈希表

系别班级:

网络工程1001

学号:

201022074

姓名:

杨帆

一、实验目的:

熟悉排序二叉树和哈希表的结构及部分算法

二、实验内容及要求:

1、构造排序二叉树,并实现增删改查。

2、构造哈希表,key值油随机数获得,自己选择解决冲突的算法。

并且计算查找次数及平均查找次数。

三、算法描述:

排序二叉树:

节点的结构:

typedefstructtree

{

intdata;

structtree*left;

structtree*right;

}Sorttree,*BiTree;

1、插入:

以输入的第一个数为树的根节点,之后输入的数若小于根节点则插入为左孩子,若大于根节点则插入为右孩子,若左右孩子均已存在,则将小于根节点的与根节点的左孩子比较,将大于根节点的与根节点的又孩子比较,然后重复上述操作。

2、查找:

递归,中序遍历二叉树。

3、删除:

首先找到与要删除的数相等的节点,若该节点为叶子节点,则直接删除。

当非叶子节点时,如果该节点在根节点的左边,则用该节点的右子树中最大的节点将它替换掉,同理,如果该节点在根节点的右边,则用该节的左子树中最小的节点将它替换掉。

4、修改:

查找到该节点,将其删除,然后在插入修改后的节点。

函数说明:

1、intCreatST(BiTree&T)//建立排序二叉树

2、voidInorder(BiTreeT)//中序遍历二叉树

3、intSearch(BiTreeT,inte)//查找

4、voidAdd(BiTree&T,inte)//插入

5、voidDelete(BiTree&T,inte)//删除

6、voidmodify(BiTree&T,inte)//修改

哈希表:

哈希表即通过key值将数据存储到不同位置而建立起的表,通过key可值直接找到数据的存储位置,减少查找所消耗的时间。

所以我们需要表节点中添加一个key来存储key值。

当添加元素的key值与表中元素key值相同时,查看下一个存储位置是否有元素,若没有将该元素存储在新找到的位置否则继续找下一位置,直到找到可存储的位置。

Key值随机产生。

哈希表结构:

typedefstructele

{

intdata;

intkey;

}Elemtype;

typedefstructhashtable

{

Elemtypeelem[Max_num];

intcount;

intsizeindex;

}HashTable;

1、宏定义表中最大存储个数

#defineMax_num15

2、表中元素初始化

Key值和数据值均为-1表示没有存储数据

#defineNo_key-1

#defineNo_data-1

 

四、程序代码:

1、二叉排序树代码:

#include

#include

typedefstructtree

{

intdata;

structtree*left;

structtree*right;

}Sorttree,*BiTree;

intCreatST(BiTree&T)

{

BiTreep,q;

intj,n=1;

while(n>0)

{

printf("输入数据:

\n");

scanf("%d",&n);

if(n==-1)break;

if(T==NULL)

{

T=(Sorttree*)malloc(sizeof(Sorttree));

T->data=n;

T->left=NULL;

T->right=NULL;

continue;

}

p=T;

while(p)

{

if(n==p->data)

{

printf("该数已经存在,请重新输入!

\n");

break;

}

q=p;

if(ndata)

{j=1;p=p->left;}

else

{j=2;p=p->right;}

}

if(p)continue;

if(j==1)

{

q->left=(Sorttree*)malloc(sizeof(Sorttree));

p=q->left;p->data=n;p->left=NULL;p->right=NULL;

}

elseif(j==2)

{q->right=(Sorttree*)malloc(sizeof(Sorttree));

p=q->right;p->data=n;p->left=NULL;p->right=NULL;}

}

return1;

}

voidInorder(BiTreeT)

{

if(T)

{

Inorder(T->left);

printf("%d",T->data);

Inorder(T->right);

}

}

intSearch(BiTreeT,inte)

{

BiTreep;

p=T;

while(p)

{

if(e==p->data)

return1;

elseif(e>p->data)

p=p->right;

elsep=p->left;

}

return0;

}

voidAdd(BiTree&T,inte)

{

BiTreep,q;

p=T;

intj=0;

while(p)

{

q=p;

if(edata)

{

j=1;

p=p->left;

}

else

{j=2;

p=p->right;}

}

if(j==1)

{

q->left=(Sorttree*)malloc(sizeof(Sorttree));

p=q->left;p->data=e;p->left=NULL;p->right=NULL;

}

else

{q->right=(Sorttree*)malloc(sizeof(Sorttree));

p=q->right;p->data=e;p->left=NULL;p->right=NULL;}

}

voidDelete(BiTree&T,inte)

{

BiTreep,q,s;

intdata;

boolt=true;

p=T;

intj=0;

if(edata)

j=1;

if(e>T->data)

j=2;

if(p->data==e)

{

if((p->left==NULL)&&(p->right==NULL))

{

T=NULL;

p=NULL;

printf("树已为空!

\n");

}

else

if(p->right==NULL)

T=T->left;

elseif(p->left==NULL)

T=T->right;

else

{

s=p->right;

q=s;

data=s->data;

while(s->left)

{

data=s->left->data;

if(t)

t=false;

elseq=q->left;

s=s->left;

}

if(t)

{

p->data=data;

if(s->right==NULL)

{

p->data=data;

p->right=NULL;

}

elsewhile(s->right)

{

s->data=s->right->data;

if(t)

t=false;

elseq=q->right;

s=s->right;

}

q->right=NULL;

}

else

{t=true;

q->left=NULL;}

}

}

while(p)

{

if(e==p->data)

break;

q=p;

if(edata)

p=p->left;

else

p=p->right;

}

if(j==1)

{

if((p->left==NULL)&&(p->right==NULL))

q->left=NULL;

elseif(p->left==NULL)

q->left=p->right;

elseif(p->right==NULL)

q->left=p->left;

else

{

s=p->right;

q=s;

data=s->data;

while(s->left)

{

data=s->left->data;

if(t)

t=false;

elseq=q->left;

s=s->left;

}

if(t)

{

p->data=data;

if(s->right==NULL)

{

p->data=data;

p->right=NULL;

}

else

while(s->right)

{

s->data=s->right->data;

if(t)

t=false;

elseq=q->right;

s=s->right;

}

q->right=NULL;

}

else

{t=true;

q->left=NULL;}

}

}

elseif(j==2)

{

if((p->left==NULL)&&(p->right==NULL))

q->right=NULL;

elseif(p->left==NULL)

q->right=p->right;

elseif(p->right==NULL)

q->right=p->left;

else

{

s=p->left;

q=s;

data=s->data;

while(s->right)

{

data=s->right->data;

if(t)

{

q=q->right;

t=false;

}

s=s->right;

}

if(t)

{

p->data=data;

if(s->left==NULL)

{

p->data=data;

p->left=NULL;

}

elsewhile(s->left)

{

s->data=s->left->data;

if(t)

t=false;

elseq=q->left;

s=s->left;

}

q->left=NULL;

}

else

{t=true;

q->left=NULL;}

}

}

}

voidmodify(BiTree&T,inte)

{

intnewelem;

if(Search(T,e))

{

Delete(T,e);

printf("enterthenewelem:

\n");

scanf("%d",&newelem);

Add(T,newelem);

}

elseprintf("cannotfindthenumber:

\n");

}

voidmain()

{

BiTreeT;

inte;

T=NULL;

CreatST(T);

Inorder(T);printf("\n");

printf("pleaseenterthenuberyouwanttoadd:

\n");//插入

scanf("%d",&e);

if(Search(T,e))

printf("thenumberhavealreadyexisted!

\n");

elseAdd(T,e);

Inorder(T);printf("\n");

printf("peaseenterthenumberyouwanttodelete:

\n");//删除

scanf("%d",&e);

if(!

Search(T,e))

printf("cannotfindthenumber!

\n");

elseDelete(T,e);

Inorder(T);printf("\n");

printf("pleaseenterthenumberyouwanttomodify:

\n");

scanf("%d",&e);

modify(T,e);

Inorder(T);printf("\n");

}

运行结果:

建立二叉排序树:

添加数据:

删除数据:

修改数据:

3、哈希表代码:

#include

#include

#include

#defineMax_num15

#defineNo_key-1

#defineNo_data-1

boolsuccess=false;

intvisit;

typedefstructele

{

intdata;

intkey;

}Elemtype;

typedefstructhashtable

{

Elemtypeelem[Max_num];

intcount;

intsizeindex;

}HashTable;

intHash(intkey)

{

returnkey%13;

}

intCreateHas(HashTable&H)

{

inti;

intc;

Elemtypeelem;

printf("pleaseenterthedata:

\n");

for(i=0;i<13;i++)

{

elem.key=rand()%100;

scanf("%d",&elem.data);

printf("zhekeyis:

%4d\n",elem.key);

c=Hash(elem.key);

while(!

success)

{

visit++;

if(H.elem[c].key==No_key)

{

H.elem[c]=elem;

H.count++;

success=true;

}

else

if(c>=13)

c=0;

elsec++;

}

success=false;

}

return1;

}

voidmain()

{

HashTableH;

inti;

visit=0;

H.count=0;

H.sizeindex=15;

srand(unsigned(time(NULL)));

for(i=0;i<13;i++)

{

H.elem[i].data=No_data;

H.elem[i].key=No_key;

}

CreateHas(H);

for(i=0;i<13;i++)

printf("%4d",H.elem[i].data);

printf("\n");

printf("查找次数:

\n");

printf("%d\n",visit);

printf("平均查找次数:

\n");

printf("%d\n",visit/13);

}

运行结果:

五、课后练习:

构造哈希表,用链地址法解决冲突。

1、算法描述:

将哈希表每个节点添加一个next指针,当遇到与该节点有key值相同的元素是,将该元素的地址赋给next。

2、程序代码:

#include

#include

#include

#defineMax_num15

#defineNo_key-1

#defineNo_data-1

boolsuccess=false;

intvisit;

typedefstructele

{

intdata;

intkey;

structele*next;

}Elemtype;

typedefstructhashtable

{

Elemtypeelem[Max_num];

intcount;

intsizeindex;

}HashTable;

intHash(intkey)

{

returnkey%13;

}

intCreateHas(HashTable&H)

{

Elemtype*elem,*p;

intc,i;

printf("pleaseenterthedata:

\n");

for(i=0;i<13;i++)

{

elem=(Elemtype*)malloc(sizeof(Elemtype));

scanf("%d",&elem->data);

elem->key=rand()%100;

elem->next=NULL;

printf("thekeyis%d:

\n",elem->key);

c=Hash(elem->key);

if(!

H.elem[c].next)

{

H.elem[c].next=elem;

H.count++;

}

else{

p=H.elem[c].next;

while(p->next)

{

H.count++;

p=p->next;

}

p->next=elem;

}

}

return1;

}

voidmain()

{

HashTableH;

Elemtype*p;

inti;

visit=0;

H.count=0;

H.sizeindex=15;

srand(unsigned(time(NULL)));

for(i=0;i<13;i++)

{

H.elem[i].data=No_data;

H.elem[i].key=No_key;

H.elem[i].next=NULL;

}

CreateHas(H);

for(i=0;i<13;i++)

{

printf("%dthis:

",i);

p=H.elem[i].next;

while(p)

{

printf("%4d",p->data);

p=p->next;

}

printf("\n");

}

printf("\n");

printf("查找次数:

\n");

printf("%d\n",H.count);

printf("平均查找次数:

\n");

printf("%d\n",H.count/13);

}

4、运行结果:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2