依旧摘自《数据结构--用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;
}
相关文章推荐
- 《数据结构与算法——C语言描述》答案 3.16 删除链表中的重复元素
- 栈及其应用 - C语言实现(摘自数据结构与算法分析 C语言描述)
- 《数据结构与算法——C语言描述》答案 3.15 自调整表的实现(链表法)
- 【数据结构】之链表(C语言描述)
- 一本好书:《数据结构及应用------C语言描述》
- 数据结构 C语言 哈希
- 《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(递归)
- 2. C#数据结构与算法 -- 查找算法(顺序查找,哈希查找,二分查找(折半),索引,二叉)
- 十.用C语言实现查找算法 (1)顺序查找;(2)二分查找(折半查找);(3)二叉排序树;(4)哈希查找
- 数据结构 C语言 哈希 链地址法
- 队列 - C语言实现(摘自数据结构与算法分析 C语言描述)
- 常用查找算法(顺序、折半、二叉树、哈希、分块)介绍
- 《算法与数据结构---C语言描述》里的求多项达式值
- 【数据结构】之串(C语言描述)
- 数据结构——单向链表的基本操作C语言描述(克服对头结点和尾结点的操作)
- 数据结构:栈的链式实现(C语言描述)
- C语言基本数据结构之五(折半插入,堆排序,冒泡排序,快速排序,并归排序)
- 《算法与数据结构---C语言描述》里的农夫过河
- 数据结构中的排序查找算法(C语言实现)
- 《算法与数据结构---C语言描述》优先队列