2015-11-20 5 views
0

Я уже реализовал этот класс, но он не работает. Я получаю сообщение об ошибке в методе enqueue(edge). Отладчик говорит, что голова не пуста, но это должно быть. Может ли кто-нибудь объяснить, почему?У меня проблемы с моим методом связанного списка

Это код:

class eList 
{ 
private: 
    class node 
    { 
    public: 
     edge e; 
     node * next; 

     node(edge x) 
     { 
      next = NULL; 
      e = x; 
     } 
    }; 

    node * head, *tail; 

    public: 
    eList() 
    { 
     head = NULL; 
     tail = head; 
    } 

Это метод, где я получаю ошибку:

void enqueue(edge component) 
    { 
     node * bby = new node(component); 
     if (head == NULL) 
     { 
      head = bby; 
      tail = head; 
     } 
     else 
     { 
      tail->next = bby; 
      tail = bby; 
     } 
    } 
}; 

Как используется этот список:

class edgeTable 
{ 
private: 
    //hash table conists of a table of lists 
    eList * table; 
    //size of table 
    int capacity; 

    //number of items in hash table 
    int numItems; 

    int createKey(edge e) { 

     unsigned int k1 = e.start->address * 37; 
     unsigned int k2 = e.end->address * 37; 
     return k1+k2%capacity; 
    } 
    int createKey(int addss) { return addss%capacity; } 

    void resize() 
    { 
     int oldCap = capacity; 
     capacity = capacity * 2; 
     edgeTable resized(capacity); 

     for (int i = 0; i < oldCap;i++) 
      resized.insert(table[i].strct()); 

     table = resized.table; 
    } 

    void insert(int key, edge e) 
    { 
     table[key].enqueue(e); 
     numItems++; 
    } 

public: 
    edgeTable() 
    { 
     capacity = 101; 
     table = new eList[capacity]; 
     numItems = 0; 
    } 

    edgeTable(int cap) 
    { 
     capacity = cap; 
     table = new eList[capacity]; 
     numItems = 0; 
    } 

    void insert(edge e) 
    { 
     insert(createKey(e), e); 
     if (numItems >= capacity/2) 
      resize(); 
    } 

и этот класс используется для:

void addEdge(int x, int y, int w) 
{ 
    vertex * u = findVertex(x); 
    vertex * v = findVertex(y); 

    edge e(u,v,w); 
    u->edgeList.insert(e); 
} 

EDIT: добавлен дополнительный код.

+0

Не могли бы вы показать больше кода, например. как вы используете свой список? – JBL

+0

@JBL добавлено больше кода. –

ответ

2

Я не могу добавить комментарий, так что я отвечаю, принимаю это как комментарий.

void enqueue(edge component) действительно нет никаких проблем с ним, но я думаю, что you'r проблема в void insert(edge e) с insert(createKey(e), e); особенно createKey(e).

в не соответствует (k1+k2)%capacity Вы хотите это или нет? потому что это ключевое значение, это среднее значение индекса для массива и, возможно, возврат неправильного индекса!

Извините, вам необходимо 50/50 комментариев!

+0

Я проверю код, потому что я не видел этого недосмотра. Благодарю. Я сообщу, когда смогу проверить это. –

+0

Это исправило мою проблему. Спасибо. –

Смежные вопросы