哈希表链地址法解决冲突

【问题描述】
为了美丽的校园计划,学校决定改进排队制度,比如说给饭卡充钱等……
给每个人一个RP值,这个RP值决定这个人来了之后要排的位置,如果当前位置已经有人,
那么从这个位置以后的人后移一位,这个人插进去,如果没有人的话就直接排到这个位置上去。
现在已知按时间从前到后来的人的名字和RP值,求按排队顺序输出排队人的名字。
【任务要求】
任务要求:用链地址法解决冲突的方式建立哈希表,将RP值相同的元素利用头插法插入到同一个单链表中,并依次输出哈希表中的每一个链表。如:
这里写图片描述

【测试数据】
输入
多组测试数据,以文件结束
每组首先一个n(1<=n<=200000),接着一行是名字和RP值,名字是不超过20的字符串
RP值不超过int
输出
按排队顺序输出排队人的名字
样例输入:
4
Yougth 1
yuanhang 2
kaichuang 2
yaoyao 1
样例输出
yaoyao Yougth kaichuang yuanhang
代码:

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10  // RP值得范围
typedef struct node
{
    char NAME[20];//姓名
    int RP;//RP值
    struct node *next;//后继

}NODE;
void Hxb(NODE *M)//初始化
{
    int i;
    for (i = 0; i < MAX; i++)
    {
        M[i].next = NULL;//每个单元后继置空
    }
}
void Createhxb(NODE *M, char name[], int rp)//建哈希表
{
    NODE *s;//新结点
    s = (NODE *)malloc(sizeof(NODE));//分配空间
    strcpy(s->NAME , name);
    s->RP = rp;
    /*头插法*/
    s->next = M[rp].next;
    M[rp].next = s;

}
int main()
{
    NODE *M,*p;
    int n,rp,i=0;
    char name[MAX];
    scanf("%d", &n);
    M = (NODE *)malloc(sizeof(NODE)*MAX);
    Hxb(M);
    /*输入创建*/
    while (n--)
    {
        scanf("%s%d", name, &rp);
        Createhxb(M, name, rp);
    }
    /*输出哈希表*/
    for (i = 0; i < MAX; i++)
    {  
        p = M[i].next;
        while (p != NULL)//每个单元的后继为空不再输出
        {
            printf("%s ", p->NAME);
            p = p->next;
        }
    }
    return 0;
}

运行截图:
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值