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

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值