您的位置:首页 > 理论基础 > 数据结构算法

依旧摘自《数据结构--用C语言描述》的查找算法 哈希和折半

2017-09-16 21:53 387 查看
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#define MAX_NUM 100
#define PRIME 97
#define NOTEEXISTED NULL

//利用链接表来处理冲突
//定义数据结构

typedef struct Person
{
long id;
char name[21];
struct Person *link;
} Student;

//建立哈希表
Student *Hashtab[MAX_NUM];

long hashfun(long);
void insert();
void del();
Student * search( Student *linklist, Student *Node );
void query();
void show();

int main()
{
char *menu_prompt =
"=======Hashing Table program  == \n "
"1.insert\n"
"2.delete\n"
"3.show\n"
"4.search\n"
"5.quit\n"
"please input a number: ";
char menusele;
int i;

//起始哈希表,将各个链表指向NULL
for( i = 0; i < MAX_NUM; i++ )
{
Hashtab[i] = NULL;

}
do
{
printf("%s", menu_prompt);
menusele = toupper( getchar());
puts(" ");
switch(menusele)
{
case '1':
insert();
break;
case '2':
del();
break;
case '3':
show();
break;
case '4':
query();
break;
case '5':
puts("byebye;");
break;
default:
puts("invalid choice!");
}

}
while(menusele != '5');
return 0;
}

long hashfun(long key)
{
return (key % PRIME);
}

void insert()
{
Student *newnode;
long index;
newnode = (Student *)malloc(sizeof (Student));
newnode->link = NULL;
printf("enter id: \n");
scanf("%ld", &newnode->id );
printf("enter a name :\n");
scanf("%s", newnode->name);
index = hashfun(newnode->id);
if( Hashtab[index] == NULL )
{
Hashtab[index] = newnode;
printf("Node insert is ok!\n");

}
else
{
if( ( search( Hashtab[index], newnode ) ) == NOTEEXISTED )
{
newnode->link = Hashtab[index];
Hashtab[index] = newnode;
printf("node insert is ok\n");

}
else
printf("record existed\n");

}
}

//删除节点函数
void del()
{
Student *node, *node_parent;
long index;
node = (Student *)malloc( sizeof(Student) );
printf(" enter id\n ");
scanf("%ld", &node->id );
index = hashfun(node->id);
node = search( Hashtab[index], node );
if( node == NOTEEXISTED )
{
printf("Record is not existed\n");

}
else
{
printf("ID: %ld  Name: %s\n", node->id, node->name );
printf("delete record \n");
if( node == Hashtab[index] )
{
Hashtab[index] = NULL;//节点是表首

}
else
{
node_parent = Hashtab[index];
while( node_parent->link->id != node->id )
node_parent = node_parent->link;
node_parent->link = node->link;
}
free(node);
}
}

Student *search( Student *linklist, Student *Node )
{
Student *ptr = linklist;
while( ptr->id != Node->id && ptr->link != NULL )
{
ptr = ptr->link;

}
if( ptr == NULL )
return NOTEEXISTED;
else
return ptr;

}

void query()
{
Student *query_node;
long index;
query_node = (Student *)malloc(sizeof(Student));
printf("enter id:\n");
scanf("%ld",&query_node->id);
index = hashfun(query_node->id);
query_node = search( Hashtab[index], query_node );
if( query_node == NOTEEXISTED)
printf("record not existed\n");
else
{
printf("id : %ld   name : %s\n", query_node->id, query_node->name);

}
}

void show()
{
int i;
Student *ptr;
puts("id                 name\n");
puts("---------------------------------");
for( i = 0; i < MAX_NUM; i++)
{
if( Hashtab[i] != NULL )
{
ptr = Hashtab[i];
while(ptr)
{
printf("%-5ld      %15s\n", ptr->id,ptr->name );
ptr = ptr->link;
}
}

}
}


折半查找

#include <stdio.h>
#include <stdlib.h>

int main()
{
int data[11] = { 0, 12, 23, 29, 38, 44, 57, 64, 75, 82, 98 };
int i, l = 0, n = 10, m, cnt = 0, input, ok = 0;
printf("\n << binary search>>\n");
printf("\nsorted data: ");
for(i = 1; i < 11; i++ )
{
printf("%d ", data[i]);

}
puts(" ");
printf("\n please enter a number from data: ");
scanf("%d", &input);
printf("\n search......\n");
m = (l + n)/2;
while( l <= n && ok == 0)
{
printf(" \n data when searching %2d time is %d! ", ++cnt,data[m]);
if(data[m] > input)
{
n = m-1;
printf("---->choice number is smaller than %d", data[m]);

}
else
{
if( data[m] < input )
{
l = m+1;
printf("---->choice number is bigger than %d", data[m]);

}
else
{
printf("\n\n found, %d id the %d th record in data!", input, m );
ok = 1;

}
}
m = ( l + n )/2;
}
if(ok==0)
printf("\n\nsorry,%d not found!", input);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐