c++意外静态链表

Posted

技术标签:

【中文标题】c++意外静态链表【英文标题】:c++ accidentally static linked list 【发布时间】:2009-05-07 11:31:07 【问题描述】:

我有一个链表类,由于某种原因,当我将一个 int 递增到一个 对象,例如linked1.size,由于某种原因,linked2.size 也会增加!

以及为什么会这样?我不是故意让它成为一个静态变量。

我的代码:

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

Vlist v2;

增加 size 成员变量发生在 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());
;

【问题讨论】:

哪个问题?您通过显示仅使用一个列表的代码来证明两个列表存在问题?我们能帮你什么吗?发布显示问题的代码,发布你得到的,发布你期望的,而不是概述问题描述。 你能发布你的类的完整定义吗? 与您的问题无关,但是使用 this->size 代替 (*this).size 不要使用TAB字符!!!请!!! 能否提供 Vlist::add() 函数定义?代码还准确显示了您如何比较尺寸。您没有向我们展示的比较代码可能存在一些逻辑错误。我猜你有'if (v1.getSize() == v2.getSize) cout 【参考方案1】:

可能linked1linked2 以某种方式指向同一个结构? 你可以试试

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

分别送给Vlist的其他成员(&linked1.data?)

编辑:现在完整的代码是可见的(并且鉴于 add_quiet(...) 和 add(...) 原则上做同样的事情)我不认为“共享”大小类字段是问题。请使用调试器并跟踪列表的地址。这很奇怪,但我现在比以往任何时候都对解决方案更感兴趣

【讨论】:

【参考方案2】:

没有看到更多代码,我不能确定,但​​是否有可能 v1 和 v2 实际上是对同一个链表对象的引用?

【讨论】:

它们似乎不是同一个结构,因为 v2 仍然是空的,除了大小正在增加。【参考方案3】:

调试器似乎在告诉我 v2 的值是什么,甚至在它出于某种原因被声明之前。 (我正在使用代码块)。 最后,我只是决定在页面顶部声明这些变量,这个特殊问题得到了解决。 我希望能发现一些设计缺陷来解释一些其他问题,如果不将我的整个项目上传到这个网站上,这些问题很难描述。没有这样的运气。 至于我的程序的其余部分...sigh

无论如何,感谢您的帮助。

【讨论】:

你在 Code::Blocks 底层使用了什么编译器?我猜,g++ 是你的选择?

以上是关于c++意外静态链表的主要内容,如果未能解决你的问题,请参考以下文章

c++静态链表

静态单链表 C++版本 Python版本

动态链表和静态链表

静态链表和动态链表的区别

链式存储结构之静态链表

线性表文档之静态链表