频道栏目
首页 > 资讯 > 其他综合 > 正文

C++栈学习——赋值运算法的重载

15-08-26        来源:[db:作者]  
收藏   我要投稿

对于编程,向来都是编的少,看的多,这种错误的学习方法一直延续至今,所以像运算符重载这么简单的东西,还是不太熟,今天借着学习栈的机会,自己写了一下链栈中赋值运算符的重载函数,写完之后对比了一下教材(《数据结构C++语言描述》任燕版),发现自己真是有种简单问题复杂化的天赋——写程序按部就班,不会优化。顺便发现了教材中一个小小的错误,在此加以纠正。

链栈赋值运算符的重载(自己写的重载函数)
说明一下自己的函数:想要实现不管左值链栈是不是为空,都能将右值链栈整个拷贝过来,所以整体思路就是:首先赋值两个链栈的公共部分的值,接着分为两种情况:(a)左值链栈元素个数小于右值链栈元素个数;(b)左值链栈元素个数大于右值链栈元素个数。
template
Linkstack  Linkstack::operator = (Linkstack  rightS)
{
    NodePointer rs,ls,s,r,p;
    rs=rightS.top;
    ls=top;
    r=NULL;
    if (this!=&rightS)
    {
        while (ls!=NULL&&rs!=NULL)//二者公共部分的赋值
        {
        ls->data=rs->data;
        rs=rs->next;
        r=ls;
        ls=ls->next;
        }

        //  左值链栈元素个数小于右值链栈元素个数
        while (ls==NULL&&rs!=NULL)
        {
        s=new(LinkNode);
        assert(s!=0);
        s->data=rs->data;
        s->next=NULL;
        rs=rs->next;
        r->next=s;
        r=r->next;
        ls=NULL;
        }

        //  左值链栈元素个数大于右值链栈元素个数
        while (ls!=NULL&&rs==NULL)
        {
            p=ls;
            r->next=ls->next;
            ls=ls->next;
            delete p;
        }

    }

    return *this;

}
链栈赋值运算符的重载(《数据结构C++语言描述》任燕版)
看完作者的程序之后,觉得很汗颜,明明可以先将左值链栈清空,然后按照一种情况来拷贝呢,为啥就是想不到呢?哎,愚蠢之极。作者的代码如下:
template
Linkstack  Linkstack::operator = (Linkstack  rightS)
{
    NodePointer p=NULL;
    NodePointer rp=rightS.top;
    NodePointer s;

    if (this!=&rightS)
    {
        clear();
        while (rp)
        {
            s=new(LinkNode);
            assert(s!=0);
            s->data=rp->data;

            if (!top)
            {
                top=s;
            }
            else
            {
                p->next=s;
            }
            p=s;
            rp=rp->next;

        }
        if (p)
            p->next=NULL;
    }

    return *this;

}
纠正一个错误
但是,作者的代码中存在一个小小的错误,即没有对指针p进行初始化,修改后程序如下:
template
Linkstack  Linkstack::operator = (Linkstack  rightS)
{
    NodePointer p=NULL;
    NodePointer rp=rightS.top;
    NodePointer s;

    if (this!=&rightS)
    {
        clear();
        while (rp)
        {
            s=new(LinkNode);
            assert(s!=0);
            s->data=rp->data;

            if (!top)
            {
                top=s;
                p=top;/////////////////自己添加的指针初始化部分,否则,指针根本不知道移到哪里去了
            }
            else
            {
                p->next=s;
            }
            p=s;
            rp=rp->next;

        }
        if (p)
            p->next=NULL;


    }

    return *this;

}
相关TAG标签
上一篇:ORACLE-017:SQL优化-isnotnull和nvl
下一篇:配置虚拟域名
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站