-1

我正在尝试进行 seq 搜索,检查重复键,如果存在,我只需要更新值。但是当我尝试使用链表来做这件事时,我遇到了内存问题。

无需检查重复键(在代码中注释掉)即可放置值的普通代码可以正常工作。

class seqSearch
{
public:
    int N;

    //helper class node
    class node
    {
    public:
        char key;
        int val;
        node *next;

        node(){ key = NULL; val = NULL; next = NULL;}
        node(char k,int v, node *nxt)
        {
            this->key = k;
            this->val = v;
            this->next = nxt;
        }

    };

    node *first;
    seqSearch(){N=0;}
    bool isEmpty(){return first == NULL;}
    int size(){return N;}
    void put(char,int);
    int get(char);
};

void seqSearch::put(char k, int v)
{
    /*
    node *oldfirst = first;
    //first = new node(k,v,oldfirst);
    first = new node;
    first->key = k;
    first->val = v;
    first->next = oldfirst;
    N++;
    */

    for (node *x = first; x!= NULL; x=x->next)
    {
        //node *oldfirst = first;
        //first = new node(k, v, oldfirst);
        if(x->key == k)
        {
            x->val = v; 
            return;
        }
    }
    first = new node(k, v, first); N++;

}
4

2 回答 2

0

你有几个问题。

  1. first当你创建一个新节点时,你总是会重置。
  2. 您将first节点设置next为等于自身,以确保您无法遍历您的列表。

尝试更多类似的东西:

void seqSearch::put(char k, int v)
{
    node* last = NULL;
    node* current = NULL;

    for (node *x = first; x!= NULL; x=x->next)
    {
        if(x->key == k)
        {
            x->val = v; 
            return;
        }
        last = x;
    }
    current = new node(k, v, NULL); N++;
    if( last == NULL )
        first = current;
    else
        last->next = current;
}

这:

  1. 将新创建的节点跟踪为当前节点。
  2. 跟踪遍历的最后一个节点,因此可以将其next设置为新创建的节点。
  3. first如果没有最后一个节点(即我们没有遍历任何节点),则设置为当前节点。
于 2013-04-08T20:30:40.860 回答
0

first应该NULL在构造函数中初始化

于 2013-04-08T20:30:51.800 回答