开散列表的查找、插入、删除操作的完整C代码

来源:互联网 发布:淘宝店老板 编辑:程序博客网 时间:2024/06/06 05:58
/*开散列表的插入、查找、删除算法的实现*/#include <stdio.h>#include <stdlib.h>#define M 13  //表长定为13typedef int KeyType;typedef struct KeyNode {KeyType key;struct KeyNode *next;}KeyNode;KeyNode *HashTable[M];//关键字查找函数int HashSearch(KeyType k){int index = k%M;KeyNode *p;p = HashTable[index];while( NULL != p ) {if( k == p->key )return index;p = p->next;}return -1;}//关键字插入函数void InsertHashTable( KeyType k ){KeyNode *p, *q;int index = k%M;q = HashTable[index];if( -1 == HashSearch( k ) ) {p = (KeyNode *)malloc(sizeof(KeyNode));p->key = k;HashTable[index] = p;p->next = q;}}//创建Hash表函数void CreateHashTable(){int i;int k;for(i=0; i<M; i++)HashTable[i] = NULL;printf("请输入关键字(以-1结束输入):\n");scanf("%d", &k);while( -1 != k ) {InsertHashTable( k );scanf("%d", &k);}}//删除关键字函数void DeleteKey( KeyType k ){int index = HashSearch( k );if( -1 != index ) {KeyNode *p, *q;q = p = HashTable[index];while( k != p->key ) {q = p;p = p->next;}if( q == p )  //删除第一个结点HashTable[index] = p->next ;elseq->next = p->next ;free(p);}elseprintf("无此关键字!");}//打印Hash表void PrintHashTable(){printf("当前的Hash表为:\n");KeyNode *p;for(int i=0; i<13; i++) {p = HashTable[i];printf("HashTable[%d]: ", i);while( NULL != p ) {printf("%d ", p->key );p = p->next ;}printf("\n");}}int main(){KeyType k;CreateHashTable();PrintHashTable();printf("请输入要插入的关键字:\n");scanf("%d", &k);InsertHashTable( k );PrintHashTable();printf("请输入要删除的关键字:\n");scanf("%d", &k);DeleteKey( k );PrintHashTable();printf("请输入要查找的关键字:\n");scanf("%d", &k);if( -1 != HashSearch( k ) )printf("当前Hash表的位置%d处查找到该关键字!\n", HashSearch( k ));else printf("无此关键字!\n");return 0;}


测试数据以及测试结果


0 0
原创粉丝点击