首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >散列类散列

散列类散列
EN

Stack Overflow用户
提问于 2012-11-22 02:43:40
回答 1查看 1K关注 0票数 1

我已经为学校的一个作业创建了一个散列类,它实现了散列并处理了冲突。在通过上传25个项目(学生记录)来测试这个类时,我注意到我的哈希类只是将每个项目按顺序插入用于存储的数组中(而不是使用哈希码)。然而,在调试模式下,insertItemCollision()函数可以正确地计算位置,但是项仍然是按顺序插入的。

是什么导致了这种情况的发生?如何解决?谢谢!

hash.h

代码语言:javascript
复制
//hash.h
#include <string>
struct Student
{
    std::string name;
    std::string id;
};

class MyHash{
public:
    MyHash();
    int hashCode(int, int);
    void insertItemCollision(std::string, std::string);
    std::string retrieveItem(std::string);
    Student students[100];
};

hash.cpp

代码语言:javascript
复制
//hash.cpp
#include <iostream>
#include "Hash.h"


MyHash::MyHash()
{
}

int MyHash::hashCode(int id, int max)
{

  return (id % max);
}

void MyHash::insertItemCollision(std::string id, std::string name)
{
    int idInt = atoi(id.c_str());
    int location;


  location = hashCode(idInt, 100);
  while (students[location].id != "")
    location = (location + 1) % 100;
  students[location].id = id;
  students[location].name = name;
}


std::string MyHash::retrieveItem(std::string id)
{
  int location;
  int startLoc;
  int idInt = atoi(id.c_str());
  bool moreToSearch = true;
  bool found;
  std::string item;

  startLoc = hashCode(idInt, 100);
  location = startLoc;
  do
  {
      if (students[location].id == id || students[location].id == "")
      moreToSearch = false;
    else
      location = (location + 1) % 100;
  } while (location != startLoc && moreToSearch);
  found = (students[location].id == id);
  if (found)
      item = students[location].name;
  return item;
}

students.txt

代码语言:javascript
复制
//students.txt
9892 Zack Lewis
4592 Ken Rodriguez
9819 Anderson Clark
1519 Ben Robinson
4597 Abigail Martinez
8542 Madison Garcia
6113 Mia Thompson
8591 Chloe Martin
9491 Daniel Harris
1698 Aiden White
5984 Alexander Walker
6541 Ethan Jackson
9549 Michael Thomas
5949 Emily Anderson
9861 Ava Taylor
5412 Noah Moore
6262 Olivia Wilson
1954 Jayden Miller
4954 William Davis
9567 Emma Brown
5195 Mason Jones
9195 Isabella Williams
5199 Sophia Johnson
1294 Jacob Smith

driver.cpp

代码语言:javascript
复制
//driver.cpp
#include <iostream>
#include<string>
#include<fstream>
#include "Hash.h"
using namespace std;


int read(string[]);
void splitString(string, Student&);
void init(string[], MyHash*, int);
int showMenu();

int main()
{
    int size;
    int choice;
    string input[100];
    MyHash* h = new MyHash();
    size = read(input); 
    init(input, h, size);

    do
    {
        choice = showMenu();
        if (choice == 1)
        {
            string id;
            cout << "Enter the id of the sutdent you would like to find: " << endl;
            cin >> id;
            std::string s = (*h).retrieveItem(id);
            if (s != "")
                cout << "The students name is: "<< s << endl;
            else
                cout << "No students matching that id was found!" <<endl;
        }

    }while (choice != 2);

    system("pause");
    return 0;
}

int read(string st[])
{
    int size = 0;
    ifstream infilestream;
    infilestream.open("test.txt");


    for(int i = 0; infilestream.good(); i++)
    {
        getline(infilestream, st[i]);
        cout<<st[i] <<endl;
        size++;
    }
    infilestream.close();
    return size;
}

void splitString(string record, Student& s)
{
    s.id = record.substr(0, 4);
    s.name = record.substr(5, record.length());
}

void init(string inputs[], MyHash* myHash, int size)
{
    for(int i = 0;i < size; i++)
    {
        splitString(inputs[i],myHash->students[i]);
        //cout << stus[i].name << " " << stus[i].id << endl;
        myHash->insertItemCollision(myHash->students[i].id, myHash->students[i].name);
    }
}

int showMenu()
{
    int chs;
    cout << "1. Find student by id." << endl;
    cout << "2. Exit." << endl;
    cin >> chs;
    return chs;
}

Fix:这两个函数已更新:

代码语言:javascript
复制
Student* splitString(string record)
{
    Student* stu = new Student();
    stu->id = record.substr(0, 4);
    stu->name = record.substr(5, record.length());
    return stu;
}

void init(string inputs[], MyHash* myHash, int size)
{
    for(int i = 0;i < size; i++)
    {
        Student* s = new Student();
        s = splitString(inputs[i]);//,myHash->students[i]);
        //cout << stus[i].name << " " << stus[i].id << endl;
        //myHash->insertItemCollision(myHash->students[i].id, myHash->students[i].name);
        myHash->insertItemCollision(s->id, s->name);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-22 03:26:46

问题是,在插入(insertItemCollision)时使用成员students,在拆分(splitString)时也是如此。所以它们会被覆盖。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13499979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档