程序设计《任选一题》

程序设计《任选一题》,第1张

/查找算法

问题描述:

设计一个实现顺序查找、二分查找(折半查找)、二叉排序树、哈希查找算法的程序,并具有人机交互界面。

基本要求:

(1)设计一个菜单将实现的查找算法的名字显示出来,并提示用户对查找算法进行选择;

(2)分别实现顺序查找、二分查找(折半查找)、二叉排序树、哈希查找;

(3)哈希函数采用除留余数发,解决冲突的方法大家任选择一种;

(4)二叉排序树必须实现构建、查找、插入、删除四个基本 *** 作;

(5)输出各种排序的结果并进行比较。/

#include<stdioh>

#include<conioh>

#include<stdlibh>

#define MAX 20

typedef struct /顺序结构数据类型/

{

int key;

}RecordType;

typedef struct

{

RecordType r[MAX+1];

int length;

}RecordList;

typedef struct

{

RecordType HashTable[MAX];

}RecordHash;

typedef struct node /二叉排序树的结点结构/

{

int key;

struct node lchild,rchild;

}BSTNode,BSTree;

void page_title(char menu_item) /返回界面函数/

{

clrscr();

printf(" 查找算法 \n\n\n\n\n%s\n\n",menu_item);

}

void return_confirm()

{

printf("按任意键返回\n");

getch(); /从键盘终端接受一个字符/

}

RecordList creat1() /建立线性表/

{

RecordList h;

int i,n=1;

hlength=0;

printf("请输入第1个数:");

scanf("%d",&i);

while(i!=0)

{

hlength++;

hr[hlength]key=i;

printf("请输入第%d个数:",++n);

scanf("%d",&i);

}

return h;

}

void InsertBST(BSTree &p,int k)

{

BSTNode s;

if(p==NULL)

{

s=(BSTNode)malloc(sizeof(BSTNode));

s->key=k;

s->lchild=NULL;

s->rchild=NULL;

p=s;

}

else if(k<p->key)

InsertBST(p->lchild,k);

else if(k>p->key)

InsertBST(p->rchild,k);

}

BSTNode creat2() /创建二叉排序树/

{

BSTNode h;

int k,i=1;

h=NULL;

printf("请输入第1个关键字:");

scanf("%d",&k);

while(k!=0)

{

InsertBST(h,k);

printf("请输入第%d个关键字:",++i);

scanf("%d",&k);

}

return h;

}

void SeqSearch(RecordList l) /顺序查找/

{

int i;

int k;

page_title("顺序查找");

printf("请输入要查找的关键字:");

scanf("%d",&k);

lr[0]key=k;

i=llength;

while(lr[i]key!=k) i--;

if(i==0) printf("查找失败\n");

else

{

printf("lr[%d]key=%d\n",i,k);

printf("查找成功\n");

}

return_confirm();

}

void Binsrch(RecordList l) /二分查找/

{

int k,j,i=0;

int low=1,high=llength,mid;

page_title("二分查找");

printf("请输入要查找的关键字:");

scanf("%d",&k);

while(low<=high)

{

mid=(low+high)/2;

if(lr[mid]key==k)

{

i=mid;

break;

}

else

if(k<lr[mid]key) high=mid-1;

else low=mid +1;

}

if(i!=0)

{

printf("lr[%d]key=%d\n",i,k);

printf("查找成功\n");

}

else printf("查找失败\n");

return_confirm();

}

void SearchBST(BSTNode h,int k) /二叉排序树的查找/

{

if(!h)

{

printf("查找失败\n");

return_confirm();

}

else if(h->key==k)

{

printf("查找成功\n");

return_confirm();

}

else if(h->key>k)

SearchBST(h->lchild,k);

else

SearchBST(h->rchild,k);

}

RecordHash creat3() /创建哈希表/

{

RecordHash ht;

int i,j=1,k;

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

htHashTable[i]key=0;

printf("请输入第1个关键字:");

scanf("%d",&k);

while(k!=0&&j<MAX)

{

i=k%13;

while(htHashTable[i]key!=0) i++;

htHashTable[i]key=k;

printf("请输入第%d个关键字:",++j);

scanf("%d",&k);

}

return ht;

}

void HashSearch(RecordHash ht) /哈希查找/

{

int k,i;

page_title("哈希查找");

printf("请输入要查找的关键字:");

scanf("%d",&k);

i=k%13;

if(htHashTable[i]key==k)

{

printf("htHashTable[%d]key=%d\n",i,k);

printf("查找成功\n");

}

else

{

i=i+1;

for(;i<MAX;i++)

if(htHashTable[i]key==k)

{

printf("htHashTable[%d]key=%d\n",i,k);

printf("查找成功\n");

break;

}

if(i==MAX) printf("查找失败\n");

}

return_confirm();

}

void main()

{

RecordList L1,L2;

BSTNode pt;

RecordHash ht;

int k,i;

printf("\n创建顺序查找线性表,输入0则结束输入(可不按顺序输入)\n");

L1=creat1();

printf("\n创建二分查找线性表,输入0则结束输入(按递增顺序输入)\n");

L2=creat1();

printf("\n创建二叉排序树,输入0则结束输入\n");

pt=creat2();

printf("\n创建哈希表\n");

ht=creat3();

menu:page_title("请选择查找方式,输入0则结束输入");

printf("顺序查找请按1\n二分查找请按2\n二叉排序树查找请按3\n哈希查找请按4\n推出请按0\n");

switch(getch())

{

case '1':

SeqSearch(L1);

break;

case '2':

Binsrch(L2);

break;

case '3':

page_title("二叉排序树查找");

printf("请输入要查找的关键字:");

scanf("%d",&k);

SearchBST(pt,k);

break;

case '4':

HashSearch(ht);

break;

case '0':

exit(0);

default :

printf("输入错误,按任意键返回");

getch();

}

goto menu;

}

1B 2B 3C 4A 5C 6D 7B 8B 9A 10C

1、编写程序。从键盘输入100个数,将正数升序排列到数组的前端,把0放在中间,负数按降序排列在0的后面。

#include"stdioh"

void main()

{

int i,j,k,s,a[100],b[100]={0},m=0,n=0;

printf("input:");

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

scanf("%d",a[i]);

for(i=0,j=0;i<100;i++)

if(a[i]>0){b[j++]=a[i];m++;}//m正数个数

for(i=0,j=99;i<100;i++)

if(a[i]<0){b[j--]=a[i]; n++;}//n负数个数

for(i=0;i<m-1;i++)//正数排序

{ k=i

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

if(b[i]>b[j])k=j;

if(i!=k)

{s=b[i];b[i]=b[k];b[k]=s;}

}

for(i=100-n;i<99;i++)//负数排序

{ k=i

for(j=i+1;j<100;j--)

if(b[i]<b[j])k=j;

if(i!=k)

{s=b[i];b[i]=b[k];b[k]=s;}

}

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

printf("%d ",b[i]);

printf("\n")

}

以上就是关于程序设计《任选一题》全部的内容,包括:程序设计《任选一题》、C语言程序设计、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9322930.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存