链表数组(使用散列)

Posted

技术标签:

【中文标题】链表数组(使用散列)【英文标题】:Array of Linked Lists (using Hashing) 【发布时间】:2016-03-31 07:19:56 【问题描述】:

我正在做一个散列项目,目前在处理一组链表时遇到了困难。我的链表只能存储 1 项,因此我创建了一个 Pair 类,其中包含 2 个成员变量(字符串键和字符串值)和各种成员函数。我的问题是如何使 Pair 与我的 Linked-list 类一起工作?我的假设是执行以下操作:如果我想将数据添加到我的链表类中,我将创建一个带有参数的函数 - void insert(Pair data) - 这会帮助我在我的列表中插入 2 个项目吗?这是我的 c++ 代码,有人可以为我校对并帮助我发现一些错误。

#ifndef List_h
#define List_h

#include "Node.h"
#include "Pair.h"
#include<string>

using namespace std;

class List
private:
    int size;
    Node<string>* headPtr;

public:
    List(); //default constructor
    List(const List& anotherList); //copy constructor -iffy, I'm not sure if my definition for this function is correct-
    virtual ~List(); //destructor
    void insert(Pair data); //insert item
    bool remove(Pair data); //remove item
    bool find(Pair data); //find item
    int getSize(); //size of list
    bool isEmpty(); //checks if list is empty
    void clear(); //clear list
;
#include "List.cpp"
#endif

.cpp

//inserting data to list
void List::insert(Pair data)

        Node<string>* newptr = new Node<string> (); //create new node
        newptr->setItem(data); //set character into node
        newptr->setNext(headPtr); //sets the ptr to headptr(null)
        headPtr = newptr; //headptr points to the node you've just created
        size++; //increment the size



 //clears the entire list
void List::clear()
    Node<string>* delPtr = headPtr; //delPtr points to the top of the list
    while(delPtr != nullptr)
        headPtr = delPtr->getNext(); //sets the head pointer to the next node
        delPtr->setNext(nullptr); //begins the process of removing the data from the top of the list here
        delete delPtr;
        delPtr = headPtr; //sets the delPtr to the headptr after deleting this way we will continue to delete data from the list until the list is empty
    

    headPtr = nullptr;
    delPtr = nullptr;
    size = 0;


 //destructor
List::~List() 
    clear();

这是我的 Pair.h 文件的外观:

#ifndef _Pair_h
#define _Pair_h

#include<iostream>
#include<string>
using namespace std;

class Pair
private:
    string key;
    string value;
protected:
    void setKey(const string& key);

public:
    Pair();
    Pair(string aValue, string key);
    string getValue() const;
    string getKey() const;
    void setValue(const string& aValue);

;

#include "Pair.cpp"
#endif

这是我的 Node.h 文件:

#ifndef _NODE
#define _NODE


template<class ItemType>
class Node

private:
   ItemType item; // A data item
   Node<ItemType>* next; // Pointer to next node

public:
   Node();
   Node(const ItemType& anItem);
   Node(const ItemType& anItem, Node<ItemType>* nextNodePtr);
   void setItem(const ItemType& anItem);
   void setNext(Node<ItemType>* nextNodePtr);
   ItemType getItem() const ;
   Node<ItemType>* getNext() const ;
; // end Node

#include "Node.cpp"
#endif

话虽如此,我最好的猜测是,当我在字典 ADT 中创建列表数组时,我的私有成员将是:

List* hashtable[size];

const int size = 31; //31 is a arbitrary prime number for the hashtable

【问题讨论】:

如果你想让你的List 类使用不同的类型,请使用模板。还要显示您的Node 类,因为不清楚您如何在setItem 方法中处理Pair 的实例以及为什么不使用Node&lt;Pair&gt;*。你真的需要链表数组吗?也许成对数组就足够了? 有人可以看看我的复制构造函数,它似乎无法正常工作@NikolayKondratyev 我的哈希表需要一个链表数组以避免冲突@NikolayKondratyev 如果你需要避免冲突,那么列表不会只有一项,它应该处理具有相同哈希的所有项目。你的代码甚至可以编译吗?我认为newptr-&gt;setItem(data); 看起来不对。 你会如何解决newptr-&gt;setItem(data); @NikolayKondratyev 【参考方案1】:

Make a new nlist = new List();(创建一个新的列表对象),set nlist headptr = anotherList.headptr.getItem() 并继续将指向anotherList 节点的ITEMS 复制到您的nlist 节点然后返回nlist

newchainPtr-&gt;setNext(nullptr); 似乎没有必要,您应该从anotherList 检查NULL。链表数组是指链表对象的数组,节点是链表对象的一部分。

如果这让您感到困惑,请查找 DEEP 副本,您会发现它。确保释放所有未使用的内存。希望这会有所帮助!

【讨论】:

以上是关于链表数组(使用散列)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之散列链表(Java语言描述)

散列集实现使用动态分配的链接列表实现数组

数据结构与算法—散列表

HashMap释疑

数据结构 散列表

JDK集合面试20问