• #哈希表 电话号码查询系统(线性和链式)#


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 风在归途 2024-06-13 22:47 采纳率: 66.7% 浏览 10 首页/ 编程语言 / #哈希表 电话号码查询系统(线性和链式)# c语言数据结构 哈希表电话号码查询系统(要线性和链式两种代码实现)实验要求和目的:(1)设每个记录有下列数据项:电话号码、用户名、地址(2)从键盘输入各记录,分别以电话号码和用户名为关键字建立散列表(3)采用一定的方法解决冲突(4)查找并显示给定电话号码的记录(5)查找并显示给定用户名的记录。 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • 阿里嘎多学长 2024-06-13 22:47
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      从您提供的代码片段来看,这是一个C语言实现的哈希表系统,但代码片段存在一些语法错误和不清晰的地方,例如变量命名不规范、缺少分号、括号使用错误等。我将基于您提供的代码片段和实验要求,给出一个简化版的哈希表实现,包括线性探测法的冲突解决策略。

      首先,我们需要定义一个结构体来存储记录:

      typedef struct {
          char name[50];
          char tel[20];
          char address[100];
      } Record;
      

      然后,定义哈希表和相关的函数原型:

      #define HASH_SIZE 100  // 假设哈希表大小为100
      
      Record hashTable[HASH_SIZE];  // 哈希表数组
      
      // 哈希函数,根据电话号码生成哈希值
      int hashFunction(char *tel);
      
      // 线性探测法解决冲突
      int linearProbe(int hashValue, char *tel);
      
      // 显示哈希表
      void displayHashTable();
      
      // 添加记录到哈希表
      void addRecordToHashTable(char *name, char *tel, char *address);
      

      接下来是哈希函数和线性探测法的实现:

      // 简单的哈希函数,可以根据电话号码生成哈希值
      int hashFunction(char *tel) {
          int sum = 0;
          for (int i = 0; tel[i] != '\0'; i++) {
              sum += tel[i] - '0';  // 假设电话号码只包含数字
          }
          return sum % HASH_SIZE;  // 使用模运算来处理哈希冲突
      }
      
      // 线性探测法解决冲突
      int linearProbe(int hashValue, char *tel) {
          while (hashTable[hashValue].tel[0] != '\0' && strcmp(hashTable[hashValue].tel, tel) != 0) {
              hashValue = (hashValue + 1) % HASH_SIZE;  // 线性探测
          }
          return hashValue;
      }
      
      // 显示哈希表
      void displayHashTable() {
          for (int i = 0; i < HASH_SIZE; i++) {
              if (hashTable[i].tel[0] != '\0') {
                  printf("Index: %d, Name: %s, Tel: %s, Address: %s\n", i, hashTable[i].name, hashTable[i].tel, hashTable[i].address);
              }
          }
      }
      
      // 添加记录到哈希表
      void addRecordToHashTable(char *name, char *tel, char *address) {
          int hashValue = hashFunction(tel);
          int index = linearProbe(hashValue, tel);
          if (hashTable[index].tel[0] == '\0') {  // 如果该位置为空,则添加记录
              strcpy(hashTable[index].name, name);
              strcpy(hashTable[index].tel, tel);
              strcpy(hashTable[index].address, address);
          } else {
              printf("Hash table is full or conflict cannot be resolved.\n");
          }
      }
      

      请注意,这里的代码只是一个简化的示例,实际应用中可能需要更复杂的哈希函数和冲突解决策略。此外,链式处理法的实现需要在哈希表的每个槽位使用链表来存储具有相同哈希值的多个记录,这在上述代码中没有体现。

      至于参考资料,您可以查阅一些在线教程或书籍,例如《数据结构与算法分析》等,这些资料通常会详细介绍哈希表的实现和优化方法。

      如果您需要链式处理法的代码实现或其他帮助,请告知,我会尽力提供支持。

      展开全部

      评论 编辑记录
    • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-13 22:47
      关注

      引自免费微信小程序:皆我百晓生

      为了构建一个电话号码查询系统,我们可以使用两种不同的哈希表实现方式:线性探测和链式地址法。下面,我将提供C语言的代码示例,实现这两种方法,并包括创建哈希表、插入记录、以及根据电话号码和用户名进行查找的功能。

      1. 线性探测哈希表

      首先定义数据结构和哈希表:

      #include 
      #include 
      #define MAX_SIZE 13 // 哈希表大小
      
      typedef struct {
          char tel[20];
          char name[30];
          char address[50];
      } Record;
      
      typedef struct {
          Record data[MAX_SIZE];
      } HashTableLinear;
      
      // 哈希函数
      int hashFunction(const char *tel) {
          int sum = 0;
          for (int i = 0; i < strlen(tel); i++) {
              sum += (int)tel[i];
          }
          return sum % MAX_SIZE;
      }
      
      // 插入记录到线性探测哈希表
      void insertRecordLinear(HashTableLinear *hashTable, const char *tel, const char *name, const char *address) {
          int index = hashFunction(tel);
          int i = index;
          while (strlen(hashTable->data[i].tel) != 0 && strcmp(hashTable->data[i].tel, tel) != 0) {
              i = (i + 1) % MAX_SIZE;
          }
          if (strlen(hashTable->data[i].tel) == 0) {
              strcpy(hashTable->data[i].tel, tel);
              strcpy(hashTable->data[i].name, name);
              strcpy(hashTable->data[i].address, address);
          }
      }
      

      2. 链式地址法哈希表

      链式地址法使用链表来处理冲突:

      typedef struct Node {
          Record record;
          struct Node *next;
      } Node;
      
      typedef struct {
          Node *buckets[MAX_SIZE];
      } HashTableChained;
      
      // 创建新节点
      Node *createNode(const char *tel, const char *name, const char *address) {
          Node *newNode = (Node *)malloc(sizeof(Node));
          strcpy(newNode->record.tel, tel);
          strcpy(newNode->record.name, name);
          strcpy(newNode->record.address, address);
          newNode->next = NULL;
          return newNode;
      }
      
      // 插入记录到链式地址法哈希表
      void insertRecordChained(HashTableChained *hashTable, const char *tel, const char *name, const char *address) {
          int index = hashFunction(tel);
          Node *newNode = createNode(tel, name, address);
          newNode->next = hashTable->buckets[index];
          hashTable->buckets[index] = newNode;
      }
      

      查找记录

      对于两种哈希表,查找记录的逻辑类似:

      // 在线性探测哈希表中查找记录
      Record *findRecordLinear(HashTableLinear *hashTable, const char *tel) {
          int index = hashFunction(tel);
          int i = index;
          do {
              if (strcmp(hashTable->data[i].tel, tel) == 0) {
                  return &hashTable->data[i];
              }
              i = (i + 1) % MAX_SIZE;
          } while (strlen(hashTable->data[i].tel) != 0 && i != index);
          return NULL;
      }
      
      // 在链式地址法哈希表中查找记录
      Record *findRecordChained(HashTableChained *hashTable, const char *tel) {
          int index = hashFunction(tel);
          Node *current = hashTable->buckets[index];
          while (current != NULL) {
              if (strcmp(current->record.tel, tel) == 0) {
                  return ¤t->record;
              }
              current = current->next;
          }
          return NULL;
      }
      

      以上是基于C语言实现的电话号码查询系统,使用了线性探测和链式地址法两种哈希表处理冲突的方法。你可以根据具体需求调整哈希表大小MAX_SIZE以及输入输出的细节。

      展开全部

      评论 编辑记录
    • 关注

      晚上好🌙🌙🌙
      本答案参考ChatGPT-3.5

      这是关于一个编程问题的答案。这个问题需要解决一个经典的哈希问题:我们有一个大数组,我们要快速找到目标值在数组中的索引位置。为了达到这个目标,我们需要一种算法来将待查找的值映射到它的相对应的位置。

      首先,我们需要创建一个空的哈希表。接下来,我们定义两个函数,一个用于插入一个新的元素到哈希表中,另一个用于查找目标值的索引位置。

      下面是两种不同的代码实现:

      1. 使用线性和链式结构
      #include 
      #include 
      
      int MLXshowhash(int array[], int n, int key)
      {
          std::unordered_map hashMap;
          for (int i = 0; i < n; ++i)
              hashMap[key] = i;
      
          return hashMap.find(key)->second;
      }
      
      int main()
      {
          int array[] = {1, 2, 3, 4, 5};
          int n = sizeof(array) / sizeof(array[0]);
          int key = 2;
          
          int index = MLXshowhash(array, n, key);
          std::cout << "Element is at index " << index << std::endl;
          
          return 0;
      }
      
      1. 使用双指针搜索法
      #include 
      #include 
      
      int MLXshowhash(int array[], int n, int key)
      {
          std::unordered_map hashMap;
          for (int i = 0; i < n; ++i)
              hashMap[key] = i;
      
          std::unordered_map::iterator it = hashMap.find(key);
          if (it != hashMap.end())
              return it->second;
          
          return -1;
      }
      
      int main()
      {
          int array[] = {1, 2, 3, 4, 5};
          int n = sizeof(array) / sizeof(array[0]);
          int key = 2;
      
          int index = MLXshowhash(array, n, key);
          if (index != -1)
              std::cout << "Element is at index " << index << std::endl;
          
          return 0;
      }
      

      以上是两种不同的哈希表实现,选择哪种取决于具体的应用场景。如果目标值的范围较小,线性探测可能更高效;如果目标值的范围较大,而我们的内存有限,那么使用链式结构可能会更快。

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    使用allure如何生成自动化测试报告 ?一文详解allure的使用 。
    今日头条小程序是什么
    训练神经网络跑了好几天,训练神经网络需要多久
    vue 部署到本机IIS 部署 SPA 应用
    MySQL锁杂谈
    VTK平滑接口-vtkSmoothPolyDataFilter&vtkWindowedSincPolyDataFilter
    Vue 路由使用
    MogDB逻辑解码与pg_recvlogical
    [Python进阶] 目录相关库:os、pathlib、shutil
    深度学习用于推荐系统
  • 原文地址:https://ask.csdn.net/questions/8118391