c ++ случайно статический связанный список - PullRequest
2 голосов
/ 07 мая 2009

У меня есть связанный класс списка и по какой-то причине, когда я увеличиваю int в один объект, например, связанный 1. по какой-то причине, связанный с ним размер 2. также увеличивается!

А идеи почему это? Я не сделал это намеренно статической переменной.

мой код:

main()
{    
Vlist v1;  
v1.add(1,0);  
v1.add(2,0);  

Vlist v2;
}

Увеличение переменной-члена размера происходит в функции add() следующим образом:

(*this).size++;

Результатом должны быть v1.size == 2 и v2.size == 0, но вместо этого v2.size == 2!

Эта проблема сводила меня с ума в течение многих часов - любая помощь будет очень признательна!

Функция добавления выглядит следующим образом:

int Vlist::quietAdd(Vertex new_vertex, int i_loc)
{
Vnode* temp= first_node;
Vnode* newNode= NULL;

//check for unique

if (find(new_vertex)!=999)
return 0;

//check for non-negative i value
if (i_loc<0)
{
    cout<<"Invalid index."<<endl;
    return 0;
}
//and exit here?

else
{
    temp = find(i_loc);

    newNode= new Vnode();

    if (size==0)
        first_node= newNode;

    //assigning to the new vnode the new Vertex value
    (*newNode).updateVertex(new_vertex.getInt());

    //the nxt pointer now points to the value it's replacing or NULL
    (*newNode).updateNextPoint(temp);

    if ((temp==NULL)&&size!=0)
    {
        //size-1 is used to get the pointer to the last value on the list
        (*newNode).updatePrevPoint(find(size-1));
        (*find((size-1))).updateNextPoint(newNode);
    }

    if (temp !=NULL)
    {
        //the new vnode's prev pointer now points to correct location
        (*newNode).updatePrevPoint((*temp).getPrevPoint());

        if ((*temp).getPrevPoint()!=NULL)
            /*the vnode that used to point to the existing vnode now
            points to new vnode*/
            (*((*temp).getPrevPoint())).updateNextPoint(newNode);

        //the old one's prev pointer points back to the new value
        (*temp).updatePrevPoint(newNode);
    }

    /*if we've just put a new vnode at the start then it should be
     pointed to by the "first vnode" pointer*/
    if (i_loc==0)
        first_node=newNode;

    (*this).size++;

}
    return 1;
}

//Vlist class definition
class Vlist
{
private:
    int size;
    Vnode* first_node;

public:
    //copy constructor
    Vlist(const Vlist& vl2):size(vl2.size), first_node(NULL)
    {
        for (int i=0;i<size;i++)
            quietAdd(vl2.read(i),i);
    }

    Vertex getNext();
    Vlist (): size(0)  {   first_node=0;    }
    ~Vlist (){};//make deep!
    bool empty();
    Vnode* find(int i_loc) const;
    int find(Vertex target)const;
    void add(Vertex new_vertex, int i_loc);
    int quietAdd(Vertex new_vertex, int i_loc);
    Vertex remove(int i_loc);

    Vertex read(int i_loc) const;
    Vnode* getFirstNode() {return first_node;}
    int getSize() const { return size;}

    void setSize(int newSize) { size = newSize;}

    char* print() const;
    void delete_List();
};

class Vnode
{
private:
    Vertex vertex;
    Vnode* prev_node;
    Vnode* nxt_node;

public:

    Vnode ()
         : prev_node(0), nxt_node(0)
    {
        vertex.update(0);
    }
    ~Vnode (){}; //destructor
    Vertex getVertex(){return vertex;}

    int getVertexInt() { return vertex.getInt();}
    Vertex getNext(){return (*nxt_node).getVertex();}
    Vnode* getNextPoint()    {   return nxt_node;    }
    Vnode* getPrevPoint()    {   return prev_node;    }
    void updateNextPoint(Vnode* newP) { nxt_node = newP;}
    void updatePrevPoint(Vnode* newP)    {prev_node= newP;}
    void updateVertex(Vertex vertexVal)  {vertex.update(vertexVal.getInt());}
};

Ответы [ 3 ]

2 голосов
/ 07 мая 2009

Может быть, linked1 и linked2 как-то указывают на одну и ту же структуру? Вы можете попробовать

printf("adress1 %p", &linked1)
printf("adress2 %p", &linked2)
printf("adress1/size %p", &linked1.size)
printf("adress2/size %p", &linked2.size)

Для других членов Vlist соответственно (& connected1.data?)

Редактировать: Теперь, когда весь код виден (и учитывая, что add_quiet (...) и add (...) делают в принципе то же самое), я не думаю, что поле класса с общим размером проблема. Используйте отладчик и отслеживайте адреса ваших списков. Это довольно странно, но сейчас я заинтересован в решении этой проблемы больше, чем когда-либо

1 голос
/ 07 мая 2009

Не видя больше кода, я не могу быть уверен, но возможно ли, что v1 и v2 фактически являются ссылками на один и тот же объект связанного списка?

0 голосов
/ 07 мая 2009

Кажется, что отладчик говорил мне, какие значения были для v2, даже до того, как он был объявлен по какой-то причине. (Я использую кодовые блоки).
В конце концов я просто решил объявить эти переменные вверху страницы, и эта конкретная проблема исправлена.
Я надеялся обнаружить некоторый недостаток дизайна, который мог бы объяснить несколько других проблем, которые довольно сложно описать, не загружая весь мой проект на этот сайт. Нет такой удачи.
Что касается остальной части моей программы ... вздох .

В любом случае, спасибо за вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...