??xml version="1.0" encoding="utf-8" standalone="yes"?>久久亚洲欧洲国产综合,国产精品99久久精品,久久人人超碰精品CAOPORENhttp://www.shnenglu.com/cxiaojia/archive/2012/08/20/187776.htmlC加C加Mon, 20 Aug 2012 09:11:00 GMThttp://www.shnenglu.com/cxiaojia/archive/2012/08/20/187776.htmlhttp://www.shnenglu.com/cxiaojia/comments/187776.htmlhttp://www.shnenglu.com/cxiaojia/archive/2012/08/20/187776.html#Feedback3http://www.shnenglu.com/cxiaojia/comments/commentRss/187776.htmlhttp://www.shnenglu.com/cxiaojia/services/trackbacks/187776.html

一步一步写q二叉树(AVL树)

作者:C加 更新旉Q?/span>2012-8-20

  q二叉树(Balanced Binary TreeQ是二叉查找树的一个进化体Q也是第一个引入^衡概늚二叉树?962q_G.M. Adelson-Velsky ?E.M. Landis发明了这|Q所以它又叫AVL树。^衡二叉树要求对于每一个节Ҏ(gu)_它的左右子树的高度之差不能超q?Q如果插入或者删除一个节点得高度之差大?Q就要进行节点之间的旋{Q将二叉树重新维持在一个^衡状态。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找Q删除的旉复杂度最好情况和最坏情况都l持在O(logN)。但是频J旋转会使插入和删除牺牲掉O(logN)左右的时_不过相对二叉查找树来_旉上稳定了很多?/p>

  q二叉树实现的大部分过E和二叉查找树是一LQ学q二叉树之前一定要会二叉查找树Q,区别在于插入和删除之后要写一个旋转算法去l持qQ维持^衡需要借助一个节炚w度的属性。我参考了机械工业出版C《数据结构与法分析-C语言描述》写了一个C++版的代码。这本书的AVLTree讲的很好Q不q没有很完整的去描述。我会一步一步的讲解如何写^衡二叉树Q重Ҏ(gu)q二叉树的核心部分Q也是旋{法?/p>

W一步:节点信息

  相对于二叉查找树的节Ҏ(gu)_我们需要用一个属性二叉树的高度,目的是维护插入和删除q程中的旋{法?/p>

代码如下Q?/p>

//AVL树节点信?/span>
template<class T>
class TreeNode
{
    public:
        TreeNode():lson(NULL),rson(NULL),freq(1),hgt(0){}
        T data;//?/span>
        int hgt;//以此节点为根的树的高?/span>
        unsigned int freq;//频率
        TreeNode* lson;//指向左儿子的地址
        TreeNode* rson;//指向叛_子的地址
};

W二步:q二叉树类的声?/strong>

  声明中的旋{函数在后边的步骤中详解?/p>

代码如下Q?/p>

//AVL树类的属性和Ҏ(gu)声明
template<class T>
class AVLTree
{
    private:
        TreeNode<T>* root;//根节?/span>
        void insertpri(TreeNode<T>* &node,T x);//插入
        TreeNode<T>* findpri(TreeNode<T>* node,T x);//查找
        void insubtree(TreeNode<T>* node);//中序遍历
        void Deletepri(TreeNode<T>* &node,T x);//删除
        int height(TreeNode<T>* node);//求树的高?/span>
        void SingRotateLeft(TreeNode<T>* &k2);//左左情况下的旋{
        void SingRotateRight(TreeNode<T>* &k2);//叛_情况下的旋{
        void DoubleRotateLR(TreeNode<T>* &k3);//左右情况下的旋{
        void DoubleRotateRL(TreeNode<T>* &k3);//叛_情况下的旋{
        int Max(int cmpa,int cmpb);//求最大?/span>

    public:
        AVLTree():root(NULL){}
        void insert(T x);//插入接口
        TreeNode<T>* find(T x);//查找接口
        void Delete(T x);//删除接口
        void traversal();//遍历接口

};

W三步:两个辅助Ҏ(gu)

  旋{法需要借助于两个功能的辅助Q一个是求树的高度,一个是求两个高度的最大倹{这里规定,一늩树的高度?1Q只有一个根节点的树的高度ؓ0Q以后每多一层高度加1。ؓ了解x针NULLq种情况Q写了一个求高度的函敎ͼq个函数q是很有必要的?/p>

代码如下Q?/p>

//计算以节点ؓ根的树的高度
template<class T>
int AVLTree<T>::height(TreeNode<T>* node)
{
    if(node!=NULL)
        return node->hgt;
    return -1;
}
//求最大?/span>
template<class T>
int AVLTree<T>::Max(int cmpa,int cmpb)
{
    return cmpa>cmpb?cmpa:cmpb;
}

W四步:旋{

  对于一个^衡的节点Q由于Q意节Ҏ(gu)多有两个儿子Q因此高度不qӞ此节点的两颗子树的高度差2.Ҏ(gu)看出Q这U不q出现在下面四U情况:

  1?节点的左子树3节点高度比右子树7节点?Q左子树3节点的左子树1节点高度大于叛_?节点Q这U情冉|?span data-mce-style="color: #ff0000;" style="color: #ff0000; ">左左?/p>

  2?节点的左子树2节点高度比右子树7节点?Q左子树2节点的左子树1节点高度于叛_?节点Q这U情冉|?span data-mce-style="color: #ff0000;" style="color: #ff0000; ">左右?/p>

  3?节点的左子树1节点高度比右子树5节点?Q右子树5节点的左子树3节点高度大于叛_?节点Q这U情冉|?span data-mce-style="color: #ff0000;" style="color: #ff0000; ">叛_?/p>

  4?节点的左子树1节点高度比右子树4节点?Q右子树4节点的左子树3节点高度于叛_?节点Q这U情冉|?span data-mce-style="color: #ff0000;" style="color: #ff0000; ">叛_?/p>

  从图2中可以可以看出,1?两种情况是对U的Q这两种情况的旋转算法是一致的Q只需要经q一ơ旋转就可以辑ֈ目标Q我们称之ؓ单旋转??两种情况也是对称的,q两U情늚旋{法也是一致的Q需要进行两ơ旋转,我们UC为双旋{?/p>

W五步:单旋?/strong>

  单旋转是针对于左左和叛_q两U情늚解决Ҏ(gu)Q这两种情况是对U的Q只要解决了左左q种情况Q右叛_很好办了。图3是左左情늚解决Ҏ(gu)Q节点k2不满_^衡特性,因ؓ它的左子树k1比右子树Z?层,而且k1子树中,更深的一层的是k1的左子树X子树Q所以属于左左情c?/p>


  Z树恢复^衡,我们把k2变成q棵树的根节点,因ؓk2大于k1Q把k2|于k1的右子树上,而原本在k1叛_树的Y大于k1Q小于k2Q就把Y|于k2的左子树上,q样既满了二叉查找树的性质Q又满了^衡二叉树的性质?/p>

  q样的操作只需要一部分指针改变Q结果我们得到另外一颗二叉查找树Q它是一AVL树,因ؓX向上一Ud了一层,Yq停留在原来的层面上QZ向下Ud了一层。整|的新高度和之前没有在左子树上插入的高度相同,插入操作使得X高度镉K了。因此,׃q颗子树高度没有变化Q所以通往根节点的路径׃需要l旋转了?/p>

代码如下Q?/p>

//左左情况下的旋{
template<class T>
void AVLTree<T>::SingRotateLeft(TreeNode<T>* &k2)
{
    TreeNode<T>* k1;
    k1=k2->lson;
    k2->lson=k1->rson;
    k1->rson=k2;

    k2->hgt=Max(height(k2->lson),height(k2->rson))+1;
    k1->hgt=Max(height(k1->lson),k2->hgt)+1;
}
//叛_情况下的旋{
template<class T>
void AVLTree<T>::SingRotateRight(TreeNode<T>* &k2)
{
    TreeNode<T>* k1;
    k1=k2->rson;
    k2->rson=k1->lson;
    k1->lson=k2;

    k2->hgt=Max(height(k2->lson),height(k2->rson))+1;
    k1->hgt=Max(height(k1->rson),k2->hgt)+1;
}

W六步:双旋?/strong>

  对于左右和右左这两种情况Q单旋{不能使它辑ֈ一个^衡状态,要经q两ơ旋转。双旋{是针对于q两U情늚解决Ҏ(gu)Q同LQ这样两U情况也是对U的Q只要解决了左右q种情况Q右左就很好办了。图4是左x늚解决Ҏ(gu)Q节点k3不满_^衡特性,因ؓ它的左子树k1比右子树Z?层,而且k1子树中,更深的一层的是k1的右子树k2子树Q所以属于左xc?/p>

   Z树恢复^衡,我们需要进行两步,W一步,把k1作ؓ根,q行一ơ右x转,旋{之后变成了左左情况Q所以第二步再进行一ơ左左旋转,最后得C一以k2为根的^衡二叉树树?/p>

代码如下Q?/p>

//左右情况的旋?/span>
template<class T>
void AVLTree<T>::DoubleRotateLR(TreeNode<T>* &k3)
{
    SingRotateRight(k3->lson);
    SingRotateLeft(k3);
}
//叛_情况的旋?/span>
template<class T>
void AVLTree<T>::DoubleRotateRL(TreeNode<T>* &k3)
{
    SingRotateLeft(k3->rson);
    SingRotateRight(k3);
}

 W七步:插入

  插入的方法和二叉查找树基本一P区别是,插入完成后需要从插入的节点开始维护一个到根节点的路径Q每l过一个节炚w要维持树的^衡。维持树的^衡要Ҏ(gu)高度差的特点选择不同的旋转算法?/p>

代码如下Q?/p>

//插入
template<class T>
void AVLTree<T>::insertpri(TreeNode<T>* &node,T x)
{
    if(node==NULL)//如果节点为空,在此节点处加入x信息
    {
        node=new TreeNode<T>();
        node->data=x;
        return;
    }
    if(node->data>x)//如果x于节点的?ql在节点的左子树中插入x
    {
        insertpri(node->lson,x);
        if(2==height(node->lson)-height(node->rson))
            if(x<node->lson->data)
                SingRotateLeft(node);
            else
                DoubleRotateLR(node);
    }
    else if(node->data<x)//如果x大于节点的?ql在节点的右子树中插入x
    {
        insertpri(node->rson,x);
        if(2==height(node->rson)-height(node->lson))//如果高度之差?的话失Mq,需要旋?/span>
            if(x>node->rson->data)
                SingRotateRight(node);
            else
                DoubleRotateRL(node);
    }
    else ++(node->freq);//如果相等,把频率?
    node->hgt=Max(height(node->lson),height(node->rson));
}
//插入接口
template<class T>
void AVLTree<T>::insert(T x)
{
    insertpri(root,x);
}

W八步:查找

和二叉查找树相比Q查找方法没有变法,不过Ҏ(gu)存储的特性,AVL树能l持在一个O(logN)的稳定的旉Q而二叉查找树则相当不E_?/p>

代码如下Q?/p>

//查找
template<class T>
TreeNode<T>* AVLTree<T>::findpri(TreeNode<T>* node,T x)
{
    if(node==NULL)//如果节点为空说明没找?q回NULL
    {
        return NULL;
    }
    if(node->data>x)//如果x于节点的?ql在节点的左子树中查找x
    {
        return findpri(node->lson,x);
    }
    else if(node->data<x)//如果x大于节点的?ql在节点的左子树中查找x
    {
        return findpri(node->rson,x);
    }
    else return node;//如果相等,找C此节?/span>
}
//查找接口
template<class T>
TreeNode<T>* AVLTree<T>::find(T x)
{
    return findpri(root,x);
}

W九(ji)步:删除

  删除的方法也和二叉查找树的一_区别是,删除完成后,需要从删除节点的父亲开始向上维护树的^衡一直到根节炏V?/p>

代码如下Q?/p>

//删除
template<class T>
void AVLTree<T>::Deletepri(TreeNode<T>* &node,T x)
{
    if(node==NULL) return ;//没有扑ֈ值是x的节?/span>
    if(x < node->data)
    {
         Deletepri(node->lson,x);//如果x于节点的?ql在节点的左子树中删除x
         if(2==height(node->rson)-height(node->lson))
            if(node->rson->lson!=NULL&&(height(node->rson->lson)>height(node->rson->rson)) )
                DoubleRotateRL(node);
            else
                SingRotateRight(node);
    }

    else if(x > node->data)
    {
         Deletepri(node->rson,x);//如果x大于节点的?ql在节点的右子树中删除x
         if(2==height(node->lson)-height(node->rson))
            if(node->lson->rson!=NULL&& (height(node->lson->rson)>height(node->lson->lson) ))
                DoubleRotateLR(node);
            else
                SingRotateLeft(node);
    }

    else//如果相等,此节点就是要删除的节?/span>
    {
        if(node->lson&&node->rson)//此节Ҏ(gu)两个儿子
        {
            TreeNode<T>* temp=node->rson;//temp指向节点的右儿子
            while(temp->lson!=NULL) temp=temp->lson;//扑ֈ叛_树中值最的节点
            
//把右子树中最节点的D值给本节?/span>
            node->data=temp->data;
            node->freq=temp->freq;
            Deletepri(node->rson,temp->data);//删除叛_树中最值的节点
            if(2==height(node->lson)-height(node->rson))
            {
                if(node->lson->rson!=NULL&& (height(node->lson->rson)>height(node->lson->lson) ))
                    DoubleRotateLR(node);
                else
                    SingRotateLeft(node);
            }
        }
        else//此节Ҏ(gu)1个或0个儿?/span>
        {
            TreeNode<T>* temp=node;
            if(node->lson==NULL)//有右儿子或者没有儿?/span>
            node=node->rson;
            else if(node->rson==NULL)//有左儿子
            node=node->lson;
            delete(temp);
            temp=NULL;
        }
    }
    if(node==NULL) return;
    node->hgt=Max(height(node->lson),height(node->rson))+1;
    return;
}
//删除接口
template<class T>
void AVLTree<T>::Delete(T x)
{
    Deletepri(root,x);
}

W十步:中序遍历

代码如下Q?/p>

//中序遍历函数
template<class T>
void AVLTree<T>::insubtree(TreeNode<T>* node)
{
    if(node==NULL) return;
    insubtree(node->lson);//先遍历左子树
    cout<<node->data<<" ";//输出根节?/span>
    insubtree(node->rson);//再遍历右子树
}
//中序遍历接口
template<class T>
void AVLTree<T>::traversal()
{
    insubtree(root);
}

W十一步:关于效率

  此数据结构插入、查扑֒删除的时间复杂度均ؓO(logN)Q但是插入和删除需要额外的旋{法需要的旉Q有时旋转过多也会媄响效率?/p>

  关于递归和非递归。我用的是递归的方法进行插入,查找和删除,而非递归的方法一般来说要比递归的方法快很多Q但是我感觉非递归的方法写出来会比较困难,所以我q是选择了递归的方法?/p>

  q有一U效率的问题是关于高度信息的存储Q由于我们需要的仅仅是高度的差,不需要知道这|的高度,所以只需要用两个二q制位就可以表示q个差。这样可以避免^衡因子的重复计算Q可以稍微的加快一些速度Q不q代码也丧失了相对简明性和清晰度。如果采用递归写法的话Q这U微加速就更显得微乎其微了?/p>

 

  如果有哪些不对的或者不清晰的地方请指出Q我会修改ƈ加以完善?/p>

   附:完整代码

 



C加 2012-08-20 17:11 发表评论
]]>
一步一步写二叉查找?/title><link>http://www.shnenglu.com/cxiaojia/archive/2012/08/09/186752.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Thu, 09 Aug 2012 08:56:00 GMT</pubDate><guid>http://www.shnenglu.com/cxiaojia/archive/2012/08/09/186752.html</guid><wfw:comment>http://www.shnenglu.com/cxiaojia/comments/186752.html</wfw:comment><comments>http://www.shnenglu.com/cxiaojia/archive/2012/08/09/186752.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/cxiaojia/comments/commentRss/186752.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/cxiaojia/services/trackbacks/186752.html</trackback:ping><description><![CDATA[<p align="center" style="text-align:center"><strong><span style="font-family:"微Y雅黑","sans-serif""></span></strong></p><p align="center" style="text-align:center"></p><div style="text-align: center;"><strong>一步一步写二叉查找?/strong></div><p> </p> <p align="center" style="text-align:center"><span style="font-family:"微Y雅黑","sans-serif";color:red">作者:</span><span style="font-family:"微Y雅黑","sans-serif"">C</span><span style="font-family:"微Y雅黑","sans-serif"">加  <span style="color:red">更新旉Q?/span>2012-8-9</span></p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;">二叉查找树(</span>BST<span style="font-family:宋体;">Q是二叉树的一个重要的应用Q它在二叉树的基上加上了q样的一个性质Q对于树中的每一个节Ҏ(gu)_如果有左儿子的话Q它的左儿子的g定小于它本n的|如果有右儿子的话Q它的右儿子的g定大于它本n的倹{?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;">二叉查找树的操作一般有插入、删除和查找Q这几个操作的^均时间复杂度都ؓ</span>O(logn)<span style="font-family:宋体;">Q插入和查找操作很简单,删除操作会复杂一点,除此之外Q因Z叉树的中序遍历是一个有序序列,我就额外加上了一个中序遍历操作?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;">二叉查找树的应用不是很多Q因为它最坏的时候跟U性表差不多,大部分会应用到它的升U版Q^衡二叉树和红黑树Q这两棵树都能把旉复杂度稳定在</span>O(logn)<span style="font-family:宋体;">左右。虽然不会用刎ͼ但是二叉查找树是一定要学好的,毕竟它是q二叉树和U黑树的基础?/span></p> <p><span style="font-family:宋体;">接下来一步一步写一个二叉查找树模板?a href="/Files/cxiaojia/bst.zip">完整代码下蝲</a></span></p> <p><strong><span style="font-family:宋体;">W一步:节点信息</span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;">二叉查找树的节点和二叉树的节点大部分是一LQ不同的是,二叉查找树多了一个值出现的ơ数。如?/span>1<span style="font-family:宋体;">昄了二叉查找树的节点信息?br /><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/bst1.png" width="600" height="148" alt="" /><br /></span></p> <p><span style="font-family:宋体;">代码如下Q?/span></p> <p> </p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">二叉查找树节点信?/span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> TreeNode<br />{<br />    <span style="color: #0000FF; ">public</span>:<br />        TreeNode():lson(NULL),rson(NULL),freq(1){}<span style="color: #008000; ">//</span><span style="color: #008000; ">初始?/span><span style="color: #008000; "><br /></span>        T data;<span style="color: #008000; ">//</span><span style="color: #008000; ">?/span><span style="color: #008000; "><br /></span>        unsigned <span style="color: #0000FF; ">int</span> freq;<span style="color: #008000; ">//</span><span style="color: #008000; ">频率</span><span style="color: #008000; "><br /></span>        TreeNode* lson;<span style="color: #008000; ">//</span><span style="color: #008000; ">指向左儿子的坐标</span><span style="color: #008000; "><br /></span>        TreeNode* rson;<span style="color: #008000; ">//</span><span style="color: #008000; ">指向叛_子的坐标</span><span style="color: #008000; "><br /></span>};</div><p> </p> <p><strong><span style="font-family:宋体;">W二步:二叉查找树类的声?/span></strong></p> <p><span style="font-family:宋体;">代码如下Q?/span></p> <p> </p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">二叉查找树类的属性和Ҏ(gu)声明</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> BST<br />{<br />    <span style="color: #0000FF; ">private</span>:<br />        TreeNode<T>* root;<span style="color: #008000; ">//</span><span style="color: #008000; ">根节?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> insertpri(TreeNode<T>* &node,T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">插入</span><span style="color: #008000; "><br /></span>        TreeNode<T>* findpri(TreeNode<T>* node,T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">查找</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> insubtree(TreeNode<T>* node);<span style="color: #008000; ">//</span><span style="color: #008000; ">中序遍历</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> Deletepri(TreeNode<T>* &node,T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">public</span>:<br />        BST():root(NULL){}<br />        <span style="color: #0000FF; ">void</span> insert(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">插入接口</span><span style="color: #008000; "><br /></span>        TreeNode<T>* find(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">查找接口</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> Delete(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除接口</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> traversal();<span style="color: #008000; ">//</span><span style="color: #008000; ">遍历接口</span><span style="color: #008000; "><br /></span> <br />};</div><p> </p> <p><strong><span style="font-family:宋体;">W三步:插入</span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;">Ҏ(gu)二叉查找树的性质Q插入一个节点的时候,如果根节点ؓI,此节点作ؓ根节点,如果根节点不为空Q就要先和根节点比较Q如果比根节点的值小Q就插入到根节点的左子树中,如果比根节点的值大插入到根节点的叛_树中Q如此递归下去Q找到插入的位置。重复节点的插入用值域中的</span>freq<span style="font-family:宋体;">标记。如?/span>2<span style="font-family:宋体;">是一个插入的q程?/span></p> <p><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/bst2.png" width="634" height="506" alt="" /><br /></p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;">二叉查找树的旉复杂度要看这|的Ş态,如果比较接近一一完全二叉树Q那么时间复杂度?/span>O(logn)<span style="font-family:宋体;">左右Q如果遇到如?/span>3<span style="font-family:宋体;">q样的二叉树的话Q那么时间复杂度׃恢复到线性的</span>O(n)<span style="font-family:宋体;">了?/span></p> <p><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/bst3.png" width="216" height="234" alt="" /><br /></p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;">q二叉树会很好的解军_?/span>3<span style="font-family:宋体;">q种情况?/span></p> <p><span style="font-family:宋体;">插入函数的代码如下:</span></p> <p> </p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">插入</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span> BST<T>::insertpri(TreeNode<T>* &node,T x)<br />{<br />    <span style="color: #0000FF; ">if</span>(node==NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果节点为空,在此节点处加入x信息</span><span style="color: #008000; "><br /></span>    {<br />        node=<span style="color: #0000FF; ">new</span> TreeNode<T>();<br />        node->data=x;<br />        <span style="color: #0000FF; ">return</span>;<br />    }<br />    <span style="color: #0000FF; ">if</span>(node->data>x)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果x于节点的?ql在节点的左子树中插入x</span><span style="color: #008000; "><br /></span>    {<br />        insertpri(node->lson,x);<br />    }<br />    <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span>(node->data<x)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果x大于节点的?ql在节点的右子树中插入x</span><span style="color: #008000; "><br /></span>    {<br />        insertpri(node->rson,x);<br />    }<br />    <span style="color: #0000FF; ">else</span> ++(node->freq);<span style="color: #008000; ">//</span><span style="color: #008000; ">如果相等,把频率?</span><span style="color: #008000; "><br /></span>}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">插入接口</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span> BST<T>::insert(T x)<br />{<br />    insertpri(root,x);<br />}</div><p> </p> <p><strong><span style="font-family:宋体;">W四步:查找</span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;">查找的功能和插入差不多一P按照插入那样的方式递归下去Q如果找CQ就q回q个节点的地址Q如果没有找刎ͼp?/span>NULL<span style="font-family:宋体;">?/span></p> <p><span style="font-family:宋体;">代码如下Q?/span></p> <p> </p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">查找</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br />TreeNode<T>* BST<T>::findpri(TreeNode<T>* node,T x)<br />{<br />    <span style="color: #0000FF; ">if</span>(node==NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果节点为空说明没找?q回NULL</span><span style="color: #008000; "><br /></span>    {<br />        <span style="color: #0000FF; ">return</span> NULL;<br />    }<br />    <span style="color: #0000FF; ">if</span>(node->data>x)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果x于节点的?ql在节点的左子树中查找x</span><span style="color: #008000; "><br /></span>    {<br />        <span style="color: #0000FF; ">return</span> findpri(node->lson,x);<br />    }<br />    <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span>(node->data<x)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果x大于节点的?ql在节点的左子树中查找x</span><span style="color: #008000; "><br /></span>    {<br />        <span style="color: #0000FF; ">return</span> findpri(node->rson,x);<br />    }<br />    <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">return</span> node;<span style="color: #008000; ">//</span><span style="color: #008000; ">如果相等,找C此节?/span><span style="color: #008000; "><br /></span>}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">查找接口</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br />TreeNode<T>* BST<T>::find(T x)<br />{<br />    <span style="color: #0000FF; ">return</span> findpri(root,x);<br />}</div><p> </p> <p><strong><span style="font-family:宋体;">W五步:删除</span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;">删除会麻烦一点,如果是叶子节点的话,直接删除可以了。如果只有一个孩子的话,p它的父亲指向它的儿子Q然后删除这个节炏V图</span>4<span style="font-family:宋体;">昄了一初始树?/span>4<span style="font-family:宋体;">节点被删除后的结果。先用一个时指针指?/span>4<span style="font-family:宋体;">节点Q再?/span>4<span style="font-family:宋体;">节点的地址指向它的孩子Q这个时?/span>2<span style="font-family:宋体;">节点的右儿子变成了</span>3<span style="font-family:宋体;">节点Q最后删除时节Ҏ(gu)向的I间Q也是</span>4<span style="font-family:宋体;">节点?/span></p> <p> <img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/bst4.png" width="431" height="241" alt="" /></p> <p><span style="font-family:宋体;">    删除有两个儿子的节点会比较复杂一些。一般的删除{略是用其右子树最的数据代替该节点的数据q归的删除掉叛_树中最数据的节点。因为右子树中数据最的节点肯定没有左儿子,所以删除的时候容易一些。图</span>5<span style="font-family:宋体;">昄了一初始树?/span>2<span style="font-family:宋体;">节点被删除后的结果。首先在</span>2<span style="font-family:宋体;">节点的右子树中找到最的节点</span>3<span style="font-family:宋体;">Q然后把</span>3<span style="font-family:宋体;">的数据赋值给</span>2<span style="font-family:宋体;">节点Q这个时?/span>2<span style="font-family:宋体;">节点的数据变?/span>3<span style="font-family:宋体;">Q然后的工作是删除叛_树中?/span>3<span style="font-family:宋体;">节点了,采用递归删除?/span></p> <p><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/bst5.png" width="431" height="239" alt="" /><br /></p> <p><span style="font-family:宋体;">    我们发现?/span>2<span style="font-family:宋体;">节点叛_树的查找q行了两遍,W一遍找到最节点ƈ赋|W二遍删除这个最的节点Q这L效率q不是很高。你能不能写出只查找一ơ就可以实现赋值和删除两个功能的函数呢Q?/span></p> <p><span style="font-family:宋体;">    如果删除的次C是很多的话,有一U删除的Ҏ(gu)会比较快一点,名字叫懒惰删除法Q当一个元素要被删除时Q它仍留在树中,只是多了一个删除的标记。这U方法的优点是删除那一步的旉开销可以避免了Q如果重新插入删除的节点的话Q插入时也避免了分配I间的时间开销。缺Ҏ(gu)树的深度会增加,查找的时间复杂度会增加,插入的时间可能会增加?/span></p> <p><span style="font-family:宋体;">删除函数代码如下Q?/span></p> <p> </p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">删除</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span> BST<T>::Deletepri(TreeNode<T>* &node,T x)<br />{<br />    <span style="color: #0000FF; ">if</span>(node==NULL) <span style="color: #0000FF; ">return</span> ;<span style="color: #008000; ">//</span><span style="color: #008000; ">没有扑ֈ值是x的节?/span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">if</span>(x < node->data)<br />    Deletepri(node->lson,x);<span style="color: #008000; ">//</span><span style="color: #008000; ">如果x于节点的?ql在节点的左子树中删除x</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span>(x > node->data)<br />    Deletepri(node->rson,x);<span style="color: #008000; ">//</span><span style="color: #008000; ">如果x大于节点的?ql在节点的右子树中删除x</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">else</span><span style="color: #008000; ">//</span><span style="color: #008000; ">如果相等,此节点就是要删除的节?/span><span style="color: #008000; "><br /></span>    {<br />        <span style="color: #0000FF; ">if</span>(node->lson&&node->rson)<span style="color: #008000; ">//</span><span style="color: #008000; ">此节Ҏ(gu)两个儿子</span><span style="color: #008000; "><br /></span>        {<br />            TreeNode<T>* temp=node->rson;<span style="color: #008000; ">//</span><span style="color: #008000; ">temp指向节点的右儿子</span><span style="color: #008000; "><br /></span>            <span style="color: #0000FF; ">while</span>(temp->lson!=NULL) temp=temp->lson;<span style="color: #008000; ">//</span><span style="color: #008000; ">扑ֈ叛_树中值最的节点<br />            </span><span style="color: #008000; ">//</span><span style="color: #008000; ">把右子树中最节点的D值给本节?/span><span style="color: #008000; "><br /></span>            node->data=temp->data;<br />            node->freq=temp->freq;<br />            Deletepri(node->rson,temp->data);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除叛_树中最值的节点</span><span style="color: #008000; "><br /></span>        }<br />        <span style="color: #0000FF; ">else</span><span style="color: #008000; ">//</span><span style="color: #008000; ">此节Ҏ(gu)1个或0个儿?/span><span style="color: #008000; "><br /></span>        {<br />            TreeNode<T>* temp=node;<br />            <span style="color: #0000FF; ">if</span>(node->lson==NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">有右儿子或者没有儿?/span><span style="color: #008000; "><br /></span>            node=node->rson;<br />            <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span>(node->rson==NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">有左儿子</span><span style="color: #008000; "><br /></span>            node=node->lson;<br />            delete(temp);<br />        }<br />    }<br />    <span style="color: #0000FF; ">return</span>;<br />}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">删除接口</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span> BST<T>::Delete(T x)<br />{<br />    Deletepri(root,x);<br />}</div><p> </p> <p><strong><span style="font-family:宋体;">W六步:中序遍历</span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;">遍历的方法和二叉树的Ҏ(gu)一P写这个方法的目的呢,是输个二叉查找树的有序序列?/span></p> <p><span style="font-family:宋体;">代码如下Q?/span></p> <p> </p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">中序遍历函数</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span> BST<T>::insubtree(TreeNode<T>* node)<br />{<br />    <span style="color: #0000FF; ">if</span>(node==NULL) <span style="color: #0000FF; ">return</span>;<br />    insubtree(node->lson);<span style="color: #008000; ">//</span><span style="color: #008000; ">先遍历左子树</span><span style="color: #008000; "><br /></span>    cout<<node->data<<" ";<span style="color: #008000; ">//</span><span style="color: #008000; ">输出根节?/span><span style="color: #008000; "><br /></span>    insubtree(node->rson);<span style="color: #008000; ">//</span><span style="color: #008000; ">再遍历右子树</span><span style="color: #008000; "><br /></span>}<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">中序遍历接口</span><span style="color: #008000; "><br /></span>template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span> BST<T>::traversal()<br />{<br />    insubtree(root);<br />}</div><p> </p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;">到此Q整个代码就完成了,代码中肯定有很多不完善的地方h出,我会加以完善Q谢谢?/span></p> <p>    </p> <p style="text-indent:21.0pt;"><span style="font-family:宋体;">对于二叉查找树不E_的时间复杂度的解x案有不少Q^衡二叉树、展树和红黑树都可以解册个问题,但效果是不一L?/span></p><p><span style="font-family:宋体;"></span></p><img src ="http://www.shnenglu.com/cxiaojia/aggbug/186752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2012-08-09 16:56 <a href="http://www.shnenglu.com/cxiaojia/archive/2012/08/09/186752.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本数据l构Q二叉树Qbinary treeQ?/title><link>http://www.shnenglu.com/cxiaojia/archive/2012/08/06/186432.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Mon, 06 Aug 2012 03:26:00 GMT</pubDate><guid>http://www.shnenglu.com/cxiaojia/archive/2012/08/06/186432.html</guid><wfw:comment>http://www.shnenglu.com/cxiaojia/comments/186432.html</wfw:comment><comments>http://www.shnenglu.com/cxiaojia/archive/2012/08/06/186432.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/cxiaojia/comments/commentRss/186432.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/cxiaojia/services/trackbacks/186432.html</trackback:ping><description><![CDATA[<p align="center" style="text-align:center"><strong><span style="font-family:"微Y雅黑","sans-serif"">基本数据l构Q二叉树Qbinary treeQ?/span></strong></p> <p align="center" style="text-align:center"><span style="font-family:"微Y雅黑","sans-serif";color:red">作者:</span><span style="font-family:"微Y雅黑","sans-serif"">C</span><span style="font-family:"微Y雅黑","sans-serif"">加  <span style="color:red">更新旉Q?/span>2012-8-6</span></p> <p><span style="font-family:"微Y雅黑","sans-serif"">二叉树首先是一|Q每个节炚w不能有多于两个的儿子Q也是树的度不能超q?。二叉树的两个儿子分别称?#8220;左儿?#8221;?#8220;叛_?#8221;Q次序不能颠倒。如?是一个简单的二叉树?br /><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/bintree1.png" width="889" height="373" alt="" /><br /></span></p> <p> </p> <p><strong><span style="font-family:"微Y雅黑","sans-serif"">二叉树的U类</span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">一U是满二叉树Q除了最后一层的叶子节点外,每一层的节点都必L两个儿子节点。如?是一个满二叉树?br /><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/bintree2.png" width="889" height="360" alt="" /><br /></span></p> <p> </p> <p style="text-indent:26.25pt;"><span style="font-family:"微Y雅黑","sans-serif"">另一U是完全二叉树,一二叉树L最后一层后剩下的节点组成的树ؓ满二叉树Q最后一层的节点从左到右q箋Q没有空出的节点Q这L树称为完全二叉树。如?是一完全二叉树?br /><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/bintree_3.png" width="919" height="353" alt="" /><br /></span></p> <p> </p> <p><strong><span style="font-family:"微Y雅黑","sans-serif"">二叉树的实现</span></strong></p> <p style="text-indent:26.25pt;"><span style="font-family:"微Y雅黑","sans-serif"">因ؓ一|有最多只有两个儿子,所以我们可以用指针直接指向他们。一个节点包括|dataQ、指向左儿子的指针(lsonQ和指向叛_子的指针QrsonQ?/span></p> <p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">struct</span> treenode<br />{<br /><span style="color: #0000FF; ">int</span> data;<br /><span style="color: #0000FF; ">struct</span> treenode* lson;<br /><span style="color: #0000FF; ">struct</span> treenode* rson;<br /> <br />}</div></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">二叉树的插入,删除,查找和链表差不多,不同的是需要指定是左儿子还是右儿子?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">二叉树的数组实现也很单,假如说根节点在arr[0]q个位置Q那么它的左儿子在arr[2*0+1]Q也是arr[1]q个位置Q它的右儿子在arr[2*0+2] Q也是arr[2]q个位置。对于下标ؓi的节Ҏ(gu)_它的左儿子的下标?*i+1Q右儿子的下标ؓ2*i+2?/span></p> <p style="text-indent:21.0pt;"><strong><span style="font-family:"微Y雅黑","sans-serif"">二叉树的遍历</span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">二叉树的遍历有三U,分别为先序遍历,中序遍历和后序遍历。这三种遍历方式是根据根节点的读取顺序来分的Q?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">先序遍历Q就是最先读取根节点Q然后再d左子树(按照同样的方法读取子树上的节点)Q最后读取右子树Q?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">中序遍历Q就是第二个d根节点,最先要d的是左子树,然后根节点,最后右子树Q?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">后序遍历Q就是最后一个读取根节点Q最先读取的是左子树Q第二个d叛_树,最后读取根节点?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">先序遍历的递归实现代码Q?/span></p> <p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span> insubtreeQ?span style="color: #0000FF; ">struct</span> treenode* treeQ?br />{<br />       If(tree==NULL) <span style="color: #0000FF; ">return</span>;<br />       cout<<tree->data;<br />    insubtree(tree->lson);<br />insubtree(tree->rson);<br />}</div></p> <p style="text-indent:21.0pt;"> </p><img src ="http://www.shnenglu.com/cxiaojia/aggbug/186432.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2012-08-06 11:26 <a href="http://www.shnenglu.com/cxiaojia/archive/2012/08/06/186432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本数据l构Q树QtreeQ?/title><link>http://www.shnenglu.com/cxiaojia/archive/2012/08/03/186123.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Fri, 03 Aug 2012 01:18:00 GMT</pubDate><guid>http://www.shnenglu.com/cxiaojia/archive/2012/08/03/186123.html</guid><wfw:comment>http://www.shnenglu.com/cxiaojia/comments/186123.html</wfw:comment><comments>http://www.shnenglu.com/cxiaojia/archive/2012/08/03/186123.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/cxiaojia/comments/commentRss/186123.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/cxiaojia/services/trackbacks/186123.html</trackback:ping><description><![CDATA[<p align="center" style="text-align:center"><strong><span style="font-family:"微Y雅黑","sans-serif"">基本数据l构Q树QtreeQ?/span></strong></p> <p align="center" style="text-align:center"><span style="font-family:"微Y雅黑","sans-serif";color:red">作者:</span><span style="font-family:"微Y雅黑","sans-serif"">C</span><span style="font-family:"微Y雅黑","sans-serif"">加 <span style="color:red">更新旉Q?/span>2012-8-3</span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">无论是链表,栈还是队列,它们都是U性结构的Q每个节点的左边最多一个节点,双也最多一个节点,对于大量的输入数据,U性表的访问时间太慢,不宜使用。这里我要说一U非U性的数据l构Q其大部分操作的q行旉q_为O(logn)?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">我们涉及到的q种数据l构叫做树。在计算机科学中Q树是非常有用的抽象概念。我们Ş象的LqC|Q一个家族的老祖可能有两个儿子,q两个儿子一个有一个儿子,一个有三个儿子Q像q样发展下去的一个族谱,是一个树Q如?所C?/span></p> <p><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/tree_1.png" border="0" alt="" width="889" height="378" /><br /><br /></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">像一늜正的树一P我们把老祖UCؓ树根,两个字儿是分叉开的两个树枝,q两|枝可以l向下分成N个树枝,循环下去Q一直到长出叶子为止?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">我们把老祖或者树根称为根QrootQ节点,老祖的儿子称为子节点Q每个儿子作为根节点又可以Ş成一|Q我们把q样的树UCؓ根节点的子树?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">树的标准定义Q?/span></p> <p align="left" style="text-indent: 21pt; "><span style="font-family: "微Y雅黑","sans-serif"">树(treeQ是包含nQn>0Q个节点的有I集合,其中Q?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">  Q?Q每个元素称点(nodeQ;</span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">  Q?Q有一个特定的节点被称为根节点或树根(rootQ?/span></p> <p align="left" style="text-indent: 21pt; "><span style="font-family: "微Y雅黑","sans-serif"">Q?Q除根节点之外的其余数据元素被分为mQm≥0Q个互不怺的结合T1QT2Q?#8230;…Tm-1Q其中每一个集合TiQ?<=i<=mQ本w也是一|Q被UC原树的子树(subtreeQ?/span></p> <p align="left" style="text-indent: 26.25pt; "><span style="font-family: "微Y雅黑","sans-serif"">树具有以下特点:</span></p> <p align="left" style="margin-left: 57pt; text-indent: -36pt; "><span style="font-family:"微Y雅黑","sans-serif";">Q?Q?span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">    </span></span><span style="font-family:"微Y雅黑","sans-serif"">每个节点有零个或多个子节炏V?/span></p> <p align="left" style="margin-left: 57pt; text-indent: -36pt; "><span style="font-family:"微Y雅黑","sans-serif";">Q?Q?span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">    </span></span><span style="font-family:"微Y雅黑","sans-serif"">每个子节点只有一个父节点?/span></p> <p align="left" style="margin-left: 57pt; text-indent: -36pt; "><span style="font-family:"微Y雅黑","sans-serif";">Q?Q?span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman'; ">    </span></span><span style="font-family:"微Y雅黑","sans-serif"">没有父节点的节点UCؓ根节炏V?/span></p> <p align="left"><strong><span style="font-family:"微Y雅黑","sans-serif"">关于树的一些术?/span></strong></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        节点的度Q一个节点含有的子树的个数称节点的度Q?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        叶节Ҏ(gu)l端节点Q度为零的节点称为叶节点Q?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        非终端节Ҏ(gu)分支节点Q度不ؓ零的节点Q?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        双亲节点或父节点Q若一个结点含有子节点Q则q个节点UCؓ其子节点的父节点Q?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        孩子节点或子节点Q一个节点含有的子树的根节点UCؓ该节点的子节点;</span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        兄弟节点Q具有相同父节点的节点互UCؓ兄弟节点Q?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        树的高度或深度:定义一|的根l点层次?Q其他节点的层次是其父结点层ơ加1。一|中所有结点的层次的最大值称|的深度。节点的层次Q从根开始定义vQ根为第1层,根的子结点ؓW?层,以此cLQ?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        树的度:一|中,最大的节点的度UCؓ树的度;</span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        节点的祖先:从根到该节点所l分支上的所有节点;</span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        子孙Q以某节点ؓ根的子树中Q一节点都称节点的子孙?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">        林Q由mQm>=0Q棵互不怺的树的集合称为森林;</span></p> <p align="left"><strong><span style="font-family:"微Y雅黑","sans-serif"">树的实现</span></strong></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">节点的代码如?</span></p> <p align="left"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">struct</span> treenode<br />{<br />       <span style="color: #0000FF; ">int</span> data;<br />       <span style="color: #0000FF; ">struct</span> treenode *fistchild;<span style="color: #008000; ">//</span><span style="color: #008000; ">W一个儿?/span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">struct</span> treenode *nextsibling;<span style="color: #008000; ">//</span><span style="color: #008000; ">下一个兄?/span><span style="color: #008000; "><br /></span>}</div></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif""><strong>树的应用</strong></span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">       大部分操作系l的目录l构是采用树结构?/span></p> <p align="left"><span style="font-family:"微Y雅黑","sans-serif"">       树的U类有很多,树所扩展出来的很多数据结构都有着很大的作用,比如说红黑树QB树,后缀树等{,q将在日后写到?/span></p><img src ="http://www.shnenglu.com/cxiaojia/aggbug/186123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2012-08-03 09:18 <a href="http://www.shnenglu.com/cxiaojia/archive/2012/08/03/186123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本数据l构Q队列(queueQ?/title><link>http://www.shnenglu.com/cxiaojia/archive/2012/08/02/186033.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Thu, 02 Aug 2012 07:00:00 GMT</pubDate><guid>http://www.shnenglu.com/cxiaojia/archive/2012/08/02/186033.html</guid><wfw:comment>http://www.shnenglu.com/cxiaojia/comments/186033.html</wfw:comment><comments>http://www.shnenglu.com/cxiaojia/archive/2012/08/02/186033.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/cxiaojia/comments/commentRss/186033.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/cxiaojia/services/trackbacks/186033.html</trackback:ping><description><![CDATA[<p align="center" style="text-align:center"><strong><span style="font-family:"微Y雅黑","sans-serif"">基本数据l构Q队列(queueQ?/span></strong></p> <p align="center" style="text-align:center"><span style="font-family:"微Y雅黑","sans-serif";color:red">作者:</span><span style="font-family:"微Y雅黑","sans-serif"">C</span><span style="font-family:"微Y雅黑","sans-serif"">加 <span style="color:red">更新旉Q?/span>2012-8-2</span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">像栈一P队列QqueueQ也是一U线性表Q它的特性是先进先出Q插入在一端,删除在另一端。就像排队一P刚来的h入队QpushQ要排在队尾(rear)Q每ơ出?pop)的都是队?front)的h。如?Q描qC一个队列模型?/span></p> <p><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/queue1.png" border="0" alt="" width="806" height="269" /><br /></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">和栈一P队列也有数组实现和链表实CU,两种实现都能l出快速的O(1)q行旉Q区别在于链表实现指针域要占用空_频繁的new和delete会消耗不的旉开销Q数l实现唯一的缺Ҏ(gu)建立时要定I间大小?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">假如一个队列最多只能站10个hQ当占满10个h后,W?1个h׃能入队,q种情况成ؓ溢出。而如果第一个h出队了,剩下?个h依然q在原来的位|,队列里空Z一个位|,但第11个hq是不能入队Q这U情冉|为假溢出。克服假溢出有效的办法是使用循环队列?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">循环队列是把队֒队首q接hQŞ成一个环Q队下一个位|就是队首,q样可以有效的防止假溢出现象Q但队列的实际容量已然固定?/span></p> <p style="text-indent:21.0pt;"><strong><span style="font-family:"微Y雅黑","sans-serif"">队列的实?/span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">队列的数l实现和栈差不多Q不同的是,栈用top做下标,队列用front和rear作ؓ下标?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">我更改了单链表的模板来实C个简单的队列。代码仅供学习,不之处q请指明Q我会对不之处q行修改和更新?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?br /></span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> queueNode<br />{<br />    <span style="color: #0000FF; ">public</span>:<br />    queueNode():next(NULL){}<br />    T data;<span style="color: #008000; ">//</span><span style="color: #008000; ">?/span><span style="color: #008000; "><br /></span>    queueNode* next;<span style="color: #008000; ">//</span><span style="color: #008000; ">指向下一个节点的指针</span><span style="color: #008000; "><br /></span>};<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> myqueue<br />{<br />    <span style="color: #0000FF; ">private</span>:<br />    unsigned <span style="color: #0000FF; ">int</span> queuelength;<br />    queueNode<T>* node;<span style="color: #008000; ">//</span><span style="color: #008000; ">临时节点</span><span style="color: #008000; "><br /></span>    queueNode<T>* rear;<span style="color: #008000; ">//</span><span style="color: #008000; ">队尾</span><span style="color: #008000; "><br /></span>    queueNode<T>* front;<span style="color: #008000; ">//</span><span style="color: #008000; ">队首</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">public</span>:<br />        myqueue();<span style="color: #008000; ">//</span><span style="color: #008000; ">初始?/span><span style="color: #008000; "><br /></span>        unsigned <span style="color: #0000FF; ">int</span> length();<span style="color: #008000; ">//</span><span style="color: #008000; ">队列元素的个?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> push(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">入队</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">bool</span> isEmpty();<span style="color: #008000; ">//</span><span style="color: #008000; ">判断队列是否为空</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> pop();<span style="color: #008000; ">//</span><span style="color: #008000; ">出队</span><span style="color: #008000; "><br /></span>        T getHead();<span style="color: #008000; ">//</span><span style="color: #008000; ">获得队首元素</span><span style="color: #008000; "><br /></span> <br />};<br />template<<span style="color: #0000FF; ">class</span> T><br />myqueue<T>::myqueue()<br />{<br />    node=NULL;<br />    rear=NULL;<br />    front=NULL;<br />    queuelength=0;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br />inline unsigned <span style="color: #0000FF; ">int</span> myqueue<T>::length(){<span style="color: #0000FF; ">return</span> queuelength;}<br /> <br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  myqueue<T>::push(T x)<br />{<br />    node=<span style="color: #0000FF; ">new</span> queueNode<T>();<span style="color: #008000; ">//</span><span style="color: #008000; ">甌一个新的节?/span><span style="color: #008000; "><br /></span>    node->data=x;<span style="color: #008000; ">//</span><span style="color: #008000; ">新节点赋gؓx</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">if</span>(rear==NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果没有节点则队列为空,node既ؓ队首,又是队尾</span><span style="color: #008000; "><br /></span>    {<br />        front=node;<br />        rear=node;<br />    }<br />    <span style="color: #0000FF; ">else</span><span style="color: #008000; ">//</span><span style="color: #008000; ">如果队列非空</span><span style="color: #008000; "><br /></span>    {<br />        rear->next=node;<span style="color: #008000; ">//</span><span style="color: #008000; ">node既ؓ节点的下一个节?/span><span style="color: #008000; "><br /></span>        rear=node;<span style="color: #008000; ">//</span><span style="color: #008000; ">node变成了尾节点,把尾节点赋gؓnode</span><span style="color: #008000; "><br /></span>    }<br />    ++queuelength;<span style="color: #008000; ">//</span><span style="color: #008000; ">元素个数+1</span><span style="color: #008000; "><br /></span>}<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">bool</span>  myqueue<T>::isEmpty()<br />{<br />    <span style="color: #0000FF; ">return</span> queuelength==0;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  myqueue<T>::pop()<br />{<br />    <span style="color: #0000FF; ">if</span>(queuelength==0) <span style="color: #0000FF; ">return</span>;<br />    node=front;<br />    front=front->next;<br />    delete(node);<br />    --queuelength;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br />T  myqueue<T>::getHead()<br />{<br />    <span style="color: #0000FF; ">return</span> front->data;<br />}</div><p> </p> <p style="text-indent:21.0pt;"><strong><span style="font-family:"微Y雅黑","sans-serif"">队列的应?br /></span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">打印机处理作业采用的是队列l构Q它们会按照提交的顺序排列v来。STL也给Z一个强大的队列Q我们直接可以去用它?/span></p> <p style="text-indent:21.0pt;"><strong><span style="font-family:"微Y雅黑","sans-serif"">队列相关问题</span></strong></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">如何用两个栈模拟一个队列,如果用两个队列模拟一个栈Q?/span></p><img src ="http://www.shnenglu.com/cxiaojia/aggbug/186033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2012-08-02 15:00 <a href="http://www.shnenglu.com/cxiaojia/archive/2012/08/02/186033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本数据l构Q栈QstackQ?/title><link>http://www.shnenglu.com/cxiaojia/archive/2012/08/01/185913.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Wed, 01 Aug 2012 08:51:00 GMT</pubDate><guid>http://www.shnenglu.com/cxiaojia/archive/2012/08/01/185913.html</guid><wfw:comment>http://www.shnenglu.com/cxiaojia/comments/185913.html</wfw:comment><comments>http://www.shnenglu.com/cxiaojia/archive/2012/08/01/185913.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/cxiaojia/comments/commentRss/185913.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/cxiaojia/services/trackbacks/185913.html</trackback:ping><description><![CDATA[<p align="center" style="text-align:center"><strong><span style="font-family:"微Y雅黑","sans-serif"">基本数据l构Q栈QstackQ?/span></strong></p> <p align="center" style="text-align:center"><span style="font-family:"微Y雅黑","sans-serif";color:red">作者:</span><span style="font-family:"微Y雅黑","sans-serif"">C</span><span style="font-family:"微Y雅黑","sans-serif"">加 <span style="color:red">更新旉Q?/span>2012-8-1</span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">栈(stackQ是限制插入和删除只能在一个位|上q行的线性表Q该位置在表的末端,叫做栈顶。添加元素只能在节点后dQ删除元素只能删除尾节点Q查看节点也只能查看节炏V添加、删除、查看依ơؓ入栈QpushQ、出栈(popQ、栈节点(topQ。Ş象的_栈是一个先q后出(LIFOQ表Q先q去的节点要{到后边q去的节点出来才能出来?/span></p> <p><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/stack_1.png" width="921" height="314" alt="" /><br /></p> <p><span style="font-family:"微Y雅黑","sans-serif"">如图1Q是一个栈的Ş象图Qtop指针指向的是栈顶节点Q所以我们可以通过top讉K?节点Q但??节点׃先于2q入q个表,所以是不可见的。如果把0节点当做头节点,2节点当做节点,那么栈限制了讉K权限Q只可以讉K节炏V?/span></p> <p><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/stack_2.png" width="922" height="298" alt="" /><br /></p> <p><span style="font-family:"微Y雅黑","sans-serif"">如图2Q当d一个节?的时候,只能在栈节点,也就是尾节点后添加,q样3节点变成了栈Ӟ2节点变成了不可见节点Q访问的时候只能访问到3节点。入栈时限制了插入地址Q只能在栈顶d节点?/span></p> <p><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/stack_3.png" width="922" height="305" alt="" /><br /></p> <p><span style="font-family:"微Y雅黑","sans-serif"">当我们执行出栈的命oӞ?的栈元素是3节点Q删除的时候只能允许删除栈的元素Q这样子3节点被删除,top指向删除后的栈顶2节点Q如?所C?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">栈有两种是实现结构,一U是序存储l构Q也是利用数组实现Q一U是铑ּ存储l构Q可以用单链表实现。数l实现栈很简单,用一个下标标记top来表C栈Ӟtop==-1Ӟ栈空Qtop==0Ӟ表示栈里只有一个元素,通过讉KtopZ标的数组元素卛_。出栈top自减Q入栈top自加O(jin)K了?/span></p> <p style="text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">单链表实现栈要比单链表的实现单点。我们通过在表的尾端插入来实现pushQ通过删除节Ҏ(gu)实现popQ获取尾节点的元素来表示top。我修改了链表那一章的单链表代码,把头节点当做栈顶节点Q实C一个简单的栈模板,仅供学习所用。代码会不定时更新?a href="/Files/cxiaojia/stack.rar">代码下蝲</a></span></p> <p style="text-indent:21.0pt;"><span style="font-family: 微Y雅黑, sans-serif; ">代码如下Q?br /></span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> stackNode<br />{<br />    <span style="color: #0000FF; ">public</span>:<br />    stackNode():next(NULL){}<br />    T data;<span style="color: #008000; ">//</span><span style="color: #008000; ">?/span><span style="color: #008000; "><br /></span>    stackNode* next;<span style="color: #008000; ">//</span><span style="color: #008000; ">指向下一个节点的指针</span><span style="color: #008000; "><br /></span>};<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> mystack<br />{<br />    <span style="color: #0000FF; ">private</span>:<br />    unsigned <span style="color: #0000FF; ">int</span> stacklength;<br />    stackNode<T>* node;<span style="color: #008000; ">//</span><span style="color: #008000; ">临时节点</span><span style="color: #008000; "><br /></span>    stackNode<T>* headnode;<span style="color: #008000; ">//</span><span style="color: #008000; ">?/span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">public</span>:<br />        mystack();<span style="color: #008000; ">//</span><span style="color: #008000; ">初始?/span><span style="color: #008000; "><br /></span>        unsigned <span style="color: #0000FF; ">int</span> length();<span style="color: #008000; ">//</span><span style="color: #008000; ">栈元素的个数</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> push(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">入栈</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">bool</span> isEmpty();<span style="color: #008000; ">//</span><span style="color: #008000; ">判断栈是否ؓI?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> pop();<span style="color: #008000; ">//</span><span style="color: #008000; ">出栈</span><span style="color: #008000; "><br /></span>        T top();<span style="color: #008000; ">//</span><span style="color: #008000; ">获得栈顶元素</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> clear();<span style="color: #008000; ">//</span><span style="color: #008000; ">清空?/span><span style="color: #008000; "><br /></span><br />};<br />template<<span style="color: #0000FF; ">class</span> T><br />mystack<T>::mystack()<br />{<br />    node=NULL;<br />    headnode=NULL;<br />    stacklength=0;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br />inline unsigned <span style="color: #0000FF; ">int</span> mystack<T>::length(){<span style="color: #0000FF; ">return</span> stacklength;}<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  mystack<T>::push(T x)<br />{<br />    node=<span style="color: #0000FF; ">new</span> stackNode<T>();<br />    node->data=x;<br />    node->next=headnode;<span style="color: #008000; ">//</span><span style="color: #008000; ">把node变成头节?/span><span style="color: #008000; "><br /></span>    headnode=node;<br />    ++stacklength;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">bool</span>  mystack<T>::isEmpty()<br />{<br />    <span style="color: #0000FF; ">return</span> stacklength==0;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  mystack<T>::pop()<br />{<br />    <span style="color: #0000FF; ">if</span>(isEmpty()) <span style="color: #0000FF; ">return</span>;<br />    node=headnode;<br />    headnode=headnode->next;<span style="color: #008000; ">//</span><span style="color: #008000; ">头节点变成它的下一个节?/span><span style="color: #008000; "><br /></span>    delete(node);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除头节?/span><span style="color: #008000; "><br /></span>    --stacklength;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br />T  mystack<T>::top()<br />{<br />    <span style="color: #0000FF; ">if</span>(!isEmpty())<br />    <span style="color: #0000FF; ">return</span> headnode->data;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  mystack<T>::clear()<br />{<br />    <span style="color: #0000FF; ">while</span>(headnode!=NULL)<br />    {<br />        node=headnode;<br />        headnode=headnode->next;<br />        delete(node);<br />    }<br />    node=NULL;<br />    headnode=NULL;<br />    stacklength=0;<br />}</div><p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:"微Y雅黑","sans-serif"">很清楚,除了<span lang="EN-US">clear</span>函数外,所有的Ҏ(gu)的时间复杂度都是<span lang="EN-US">O(1)</span>。这U实现方式的~点在于?span lang="EN-US">new</span>?span lang="EN-US">delete</span>的调用的开销是昂늚Q所以采用数l的方式实现会更好一炏V?br /><span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:"微Y雅黑","sans-serif""><strong>栈的应用</strong><span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:"微Y雅黑","sans-serif"">使用栈的时候一般不用自己重新去写,因ؓ<span lang="EN-US">STL</span>l我们实C一个很安全的栈Q可以放心去使用?/span><span style="font-size:10.5pt;mso-bidi-font-size:11.0pt; font-family:"微Y雅黑","sans-serif";mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;mso-ansi-language:EN-US;mso-fareast-language: ZH-CN;mso-bidi-language:AR-SA">也可以用数组模拟一个,很简单?/span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:"微Y雅黑","sans-serif"">~译器调用函数就用了栈结构,当第一个函数还没执行完毕,调用W二个函数的时候,~译器就会把W一个函数压栈,W二个函数调用完毕的时候,׃取栈函敎ͼ也就是第一个函数l执行?span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:"微Y雅黑","sans-serif"">qW号 <span lang="EN-US"><a >http://acm.nyist.net/JudgeOnline/problem.php?pid=2</a><o:p></o:p></span></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:"微Y雅黑","sans-serif"">中缀转后~ <span lang="EN-US"><a >http://acm.nyist.net/JudgeOnline/problem.php?pid=467</a><o:p></o:p></span></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span style="font-family:"微Y雅黑","sans-serif"">后缀试求?<span lang="EN-US"><a >http://acm.nyist.net/JudgeOnline/problem.php?pid=35</a><o:p></o:p></span></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span lang="EN-US" style="font-family:"微Y雅黑","sans-serif"">poj 3250 <a >http://acm.pku.edu.cn/JudgeOnline/problem?id=3250</a><o:p></o:p></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span lang="EN-US" style="font-family:"微Y雅黑","sans-serif"">poj 1363 <a >http://acm.pku.edu.cn/JudgeOnline/problem?id=1363</a><o:p></o:p></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span lang="EN-US" style="font-family:"微Y雅黑","sans-serif"">poj 1208 <a >http://acm.pku.edu.cn/JudgeOnline/problem?id=1208</a><o:p></o:p></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span lang="EN-US" style="font-family:"微Y雅黑","sans-serif"">poj 1686 <a >http://acm.pku.edu.cn/JudgeOnline/problem?id=1686</a><o:p></o:p></span></p> <p class="MsoNormal" style="text-indent:21.0pt;mso-char-indent-count:2.0"><span lang="EN-US" style="font-family:"微Y雅黑","sans-serif"">poj 3250 <a >http://acm.pku.edu.cn/JudgeOnline/problem?id=2045</a><o:p></o:p></span></p> <pre style="text-indent:21.0pt;mso-char-indent-count:2.0;line-height:11.2pt; background:#FCFEFC"><span lang="EN-US" style="font-size:10.5pt;mso-bidi-font-size: 11.0pt;font-family:"微Y雅黑","sans-serif";mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi">hdu 1022 <a >http://acm.hdu.edu.cn/showproblem.php?pid=1022</a><o:p></o:p></span></pre><span style="font-family: 微Y雅黑, sans-serif; "><br /><br /><br /></span><p> </p><img src ="http://www.shnenglu.com/cxiaojia/aggbug/185913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2012-08-01 16:51 <a href="http://www.shnenglu.com/cxiaojia/archive/2012/08/01/185913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本数据l构Q链表(listQ?/title><link>http://www.shnenglu.com/cxiaojia/archive/2012/07/31/185760.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Tue, 31 Jul 2012 09:41:00 GMT</pubDate><guid>http://www.shnenglu.com/cxiaojia/archive/2012/07/31/185760.html</guid><wfw:comment>http://www.shnenglu.com/cxiaojia/comments/185760.html</wfw:comment><comments>http://www.shnenglu.com/cxiaojia/archive/2012/07/31/185760.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/cxiaojia/comments/commentRss/185760.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/cxiaojia/services/trackbacks/185760.html</trackback:ping><description><![CDATA[<p align="center" style="text-align:center"><span style="font-family:"微Y雅黑","sans-serif""><strong>基本数据l构Q链表(listQ?/strong></span></p> <p align="center" style="text-align:center"><span style="font-family:"微Y雅黑","sans-serif";color:red">作者:</span><span style="font-family:"微Y雅黑","sans-serif"">C</span><span style="font-family:"微Y雅黑","sans-serif"">加 <span style="color:red">更新旉Q?/span>2012-7-31</span></p> <p style="text-indent:20.6pt;"><span style="font-family:"微Y雅黑","sans-serif"">谈到链表之前Q先说一下线性表。线性表是最基本、最单、也是最常用的一U?/span><a target="_blank"><span style="font-family:"微Y雅黑","sans-serif";color:windowtext;text-decoration: none;text-underline:none">数据l构</span></a><span style="font-family:"微Y雅黑","sans-serif"">。线性表中数据元素之间的关系是一对一的关p,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表有两U存储方式,一U是序存储l构Q另一U是铑ּ存储l构?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">序存储l构是两个盔R的元素在内存中也是相?c)。这U存储方式的优点是查询的旉复杂度ؓO(1)Q通过首地址和偏U量可以直接访问到某元素,关于查找的适配法很多Q最快可以达到O(logn)。缺Ҏ(gu)插入和删除的旉复杂度最坏能辑ֈO(n)Q如果你在第一个位|插入一个元素,你需要把数组的每一个元素向后移动一位,如果你在W一个位|删除一个元素,你需要把数组的每一个元素向前移动一位。还有一个缺点,是当你不确定元素的数量Ӟ你开的数l必M证能够放下元素最大数量,遗憾的是如果实际数量比最大数量少很多Ӟ你开的数l没有用到的内存只能浪Ҏ(gu)了?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">我们常用的数l就是一U典型的序存储l构Q如??/span></p><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/list_1.png" width="650" height="330" alt="" /><br /><p style="text-indent:20.6pt;"><span style="font-family:"微Y雅黑","sans-serif"">铑ּ存储l构是两个盔R的元素在内存中可能不是相?c)Q每一个元素都有一个指针域Q指针域一般是存储着C一个元素的指针。这U存储方式的优点是插入和删除的时间复杂度为O(1)Q不会浪费太多内存,d元素的时候才会申请内存,删除元素会释攑ֆ存,。缺Ҏ(gu)讉K的时间复杂度最坏ؓO(n)Q关于查扄法很少Q一般只能遍历,q样旉复杂度也是线性(O(n)Q的?频繁的申请和释放内存也会消耗时间?/span></p> <p style="text-indent:20.6pt;"><span style="font-family:"微Y雅黑","sans-serif"">序表的Ҏ(gu)是随机dQ也是讉K一个元素的旉复杂度是O(1)Q链式表的特性是插入和删除的旉复杂度ؓO(1)。要Ҏ(gu)实际情况去选取适合自己的存储结构?/span></p> <p style="text-indent:20.6pt;"><span style="font-family:"微Y雅黑","sans-serif"">链表是铑ּ存储的线性表。根据指针域的不同,链表分ؓ单向链表、双向链表、@环链表等{?/span></p> <p style="margin-left:43.15pt;text-indent:-22.5pt;"><span style="font-family:"微Y雅黑","sans-serif";">一?</span><span style="font-family:"微Y雅黑","sans-serif"">单向链表QslistQ?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">链表中最单的一U是单向链表Q每个元素包含两个域Q值域和指针域Q我们把q样的元素称之ؓ节点。每个节点的指针域内有一个指针,指向下一个节点,而最后一个节点则指向一个空倹{如?是一个单向链表?/span></p><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/list_2.png" border="0" alt="" width="747" height="271" /><br /><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">一个单向链表的节点被分成两个部分。第一个部分保存或者显C关于节点的信息Q第二个部分存储下一个节点的地址。单向链表只可向一个方向遍历?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">我写了一个简单的C++版单向链表类模板Q就用这D代码讲解一下一个具体的单向链表该怎么写(代码仅供学习Q,当然首先你要具备C++基础知识和简单的模板元编E?br /><a href="/Files/cxiaojia/slist.zip">完整代码</a><br /></span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">首先我们要写一个节点类Q链表中的每一个节点就是一个节点类的对象。如??br /></span></p><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/list_3.png" width="771" height="266" alt="" /><br /><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?/span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> slistNode<br />{<br />    <span style="color: #0000FF; ">public</span>:<br />    slistNode(){next=NULL;}<span style="color: #008000; ">//</span><span style="color: #008000; ">初始?/span><span style="color: #008000; "><br /></span>    T data;<span style="color: #008000; ">//</span><span style="color: #008000; ">?/span><span style="color: #008000; "><br /></span>    slistNode* next;<span style="color: #008000; ">//</span><span style="color: #008000; ">指向下一个节点的指针</span><span style="color: #008000; "><br /></span>};</div><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">W二步,写单链表cȝ声明Q包括属性和Ҏ(gu)?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?/span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">class</span> myslist<br />{<br />    <span style="color: #0000FF; ">private</span>:<br />    unsigned <span style="color: #0000FF; ">int</span> listlength;<br />    slistNode<T>* node;<span style="color: #008000; ">//</span><span style="color: #008000; ">临时节点</span><span style="color: #008000; "><br /></span>    slistNode<T>* lastnode;<span style="color: #008000; ">//</span><span style="color: #008000; ">头结?/span><span style="color: #008000; "><br /></span>    slistNode<T>* headnode;<span style="color: #008000; ">//</span><span style="color: #008000; ">节?/span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">public</span>:<br />        myslist();<span style="color: #008000; ">//</span><span style="color: #008000; ">初始?/span><span style="color: #008000; "><br /></span>        unsigned <span style="color: #0000FF; ">int</span> length();<span style="color: #008000; ">//</span><span style="color: #008000; ">链表元素的个?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> add(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">表尾d元素</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> traversal();<span style="color: #008000; ">//</span><span style="color: #008000; ">遍历整个链表q打?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">bool</span> isEmpty();<span style="color: #008000; ">//</span><span style="color: #008000; ">判断链表是否为空</span><span style="color: #008000; "><br /></span>        slistNode<T>* find(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">查找W一个gؓx的节?q回节点的地址,找不到返回NULL</span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> Delete(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除W一个gؓx的节?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> insert(T x,slistNode<T>* p);<span style="color: #008000; ">//</span><span style="color: #008000; ">在p节点后插入gؓx的节?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">void</span> insertHead(T x);<span style="color: #008000; ">//</span><span style="color: #008000; ">在链表的头部插入节点</span><span style="color: #008000; "><br /></span>};</div><br /><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">W三步,写构造函敎ͼ初始化链表类的属性?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?/span></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br />myslist<T>::myslist()<br />{<br />    node=NULL;<br />    lastnode=NULL;<br />    headnode=NULL;<br />    listlength=0;<br />}</div><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">W四步,实现add()Ҏ(gu)?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?/span></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  myslist<T>::add(T x)<br />{<br />    node=<span style="color: #0000FF; ">new</span> slistNode<T>();<span style="color: #008000; ">//</span><span style="color: #008000; ">甌一个新的节?/span><span style="color: #008000; "><br /></span>    node->data=x;<span style="color: #008000; ">//</span><span style="color: #008000; ">新节点赋gؓx</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">if</span>(lastnode==NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果没有节点则链表为空,node既ؓ头结?又是节?/span><span style="color: #008000; "><br /></span>    {<br />        headnode=node;<br />        lastnode=node;<br />    }<br />    <span style="color: #0000FF; ">else</span><span style="color: #008000; ">//</span><span style="color: #008000; ">如果链表非空</span><span style="color: #008000; "><br /></span>    {<br />        lastnode->next=node;<span style="color: #008000; ">//</span><span style="color: #008000; ">node既ؓ节点的下一个节?/span><span style="color: #008000; "><br /></span>        lastnode=node;<span style="color: #008000; ">//</span><span style="color: #008000; ">node变成了尾节点,把尾节点赋gؓnode</span><span style="color: #008000; "><br /></span>    }<br />    ++listlength;<span style="color: #008000; ">//</span><span style="color: #008000; ">元素个数+1</span><span style="color: #008000; "><br /></span>}</div><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">W五步,实现traversal()函数Q遍历ƈ输出节点信息?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?br /></span></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  myslist<T>::traversal()<br />{<br />    node=headnode;<span style="color: #008000; ">//</span><span style="color: #008000; ">用时节Ҏ(gu)向头l点</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">while</span>(node!=NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">遍历链表q输?/span><span style="color: #008000; "><br /></span>    {<br />        cout<<node->data<<ends;<br />        node=node->next;<br />    }<br />    cout<<endl;<br />}</div><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">W六步,实现isEmpty()函数Q判断链表是否ؓI,q回真ؓI,假则不空?/span></p> <p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?/span></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">bool</span>  myslist<T>::isEmpty()<br />{<br />    <span style="color: #0000FF; ">return</span> listlength==0;<br />}</div><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">W七步,实现find()函数?/span></p> <p style="text-indent: 20.45pt; "><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?br /></span></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br />slistNode<T>* myslist<T>::find(T x)<br />{<br />    node=headnode;<span style="color: #008000; ">//</span><span style="color: #008000; ">用时节Ҏ(gu)向头l点</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">while</span>(node!=NULL&&node->data!=x)<span style="color: #008000; ">//</span><span style="color: #008000; ">遍历链表,遇到值相同的节点跛_</span><span style="color: #008000; "><br /></span>    {<br />        node=node->next;<br />    }<br />    <span style="color: #0000FF; ">return</span> node;<span style="color: #008000; ">//</span><span style="color: #008000; ">q回扑ֈ的节点的地址,如果没有扑ֈ则返回NULL</span><span style="color: #008000; "><br /></span>}</div><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">W八步,实现delete()函数Q删除第一个gؓx的节点,如图4?/span></p><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/list_4.png" width="771" height="259" alt="" /><br /><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?br /></span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  myslist<T>::Delete(T x)<br />{<br />    slistNode<T>* temp=headnode;<span style="color: #008000; ">//</span><span style="color: #008000; ">甌一个时节Ҏ(gu)向头节点</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">if</span>(temp==NULL) <span style="color: #0000FF; ">return</span>;<span style="color: #008000; ">//</span><span style="color: #008000; ">如果头节点ؓI?则该链表无元?直接q回</span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">if</span>(temp->data==x)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果头节点的gؓ要删除的?则删除投节点</span><span style="color: #008000; "><br /></span>    {<br />        headnode=temp->next;<span style="color: #008000; ">//</span><span style="color: #008000; ">把头节点指向头节点的下一个节?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">if</span>(temp->next==NULL) lastnode=NULL;<span style="color: #008000; ">//</span><span style="color: #008000; ">如果链表中只有一个节?删除之后没有节点了,把尾节点|ؓI?/span><span style="color: #008000; "><br /></span>        delete(temp);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除头节?/span><span style="color: #008000; "><br /></span>        <span style="color: #0000FF; ">return</span>;<br />    }<br />    <span style="color: #0000FF; ">while</span>(temp->next!=NULL&&temp->next->data!=x)<span style="color: #008000; ">//</span><span style="color: #008000; ">遍历链表扑ֈW一个gx相等的节?temp表示q个节点的上一个节?/span><span style="color: #008000; "><br /></span>    {<br />        temp=temp->next;<br />    }<br />    <span style="color: #0000FF; ">if</span>(temp->next==NULL) <span style="color: #0000FF; ">return</span>;<span style="color: #008000; ">//</span><span style="color: #008000; ">如果没有扑ֈ则返?/span><span style="color: #008000; "><br /></span>    <span style="color: #0000FF; ">if</span>(temp->next==lastnode)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果扑ֈ的时候尾节点</span><span style="color: #008000; "><br /></span>    {<br />        lastnode=temp;<span style="color: #008000; ">//</span><span style="color: #008000; ">把尾节点指向他的上一个节?/span><span style="color: #008000; "><br /></span>        delete(temp->next);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除节?/span><span style="color: #008000; "><br /></span>        temp->next=NULL;<br />    }<br />    <span style="color: #0000FF; ">else</span><span style="color: #008000; ">//</span><span style="color: #008000; ">如果不是节?如图4</span><span style="color: #008000; "><br /></span>    {<br />        node=temp->next;<span style="color: #008000; ">//</span><span style="color: #008000; ">用时节点node指向要删除的节点</span><span style="color: #008000; "><br /></span>        temp->next=node->next;<span style="color: #008000; ">//</span><span style="color: #008000; ">要删除的节点的上一个节Ҏ(gu)向要删除节点的下一个节?/span><span style="color: #008000; "><br /></span>        delete(node);<span style="color: #008000; ">//</span><span style="color: #008000; ">删除节点</span><span style="color: #008000; "><br /></span>        node=NULL;<br />    }<br />}</div><p class="MsoNormal" style="text-indent:20.45pt;mso-char-indent-count:1.95"><span style="font-family:"微Y雅黑","sans-serif"">W九(ji)步,实现<span lang="EN-US">insert()</span>?span lang="EN-US">insertHead()</span>函数Q在<span lang="EN-US">p</span>节点后插入gؓ<span lang="EN-US">x</span>的节炏V如?span lang="EN-US">5</span>?span lang="EN-US"><o:p></o:p></span></span></p><span style="font-family:"微Y雅黑","sans-serif""><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/list_5.png" width="769" height="296" alt="" /><br /><br /></span><p> </p><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">代码如下Q?/span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  myslist<T>::insert(T x,slistNode<T>* p)<br />{<br />    <span style="color: #0000FF; ">if</span>(p==NULL) <span style="color: #0000FF; ">return</span>;<br />    node=<span style="color: #0000FF; ">new</span> slistNode<T>();<span style="color: #008000; ">//</span><span style="color: #008000; ">甌一个新的空?/span><span style="color: #008000; "><br /></span>    node->data=x;<span style="color: #008000; ">//</span><span style="color: #008000; ">如图5</span><span style="color: #008000; "><br /></span>    node->next=p->next;<br />    p->next=node;<br />    <span style="color: #0000FF; ">if</span>(node->next==NULL)<span style="color: #008000; ">//</span><span style="color: #008000; ">如果node为尾节点</span><span style="color: #008000; "><br /></span>    lastnode=node;<br />}<br />template<<span style="color: #0000FF; ">class</span> T><br /><span style="color: #0000FF; ">void</span>  myslist<T>::insertHead(T x)<br />{<br />    node=<span style="color: #0000FF; ">new</span> slistNode<T>();<br />    node->data=x;<br />    node->next=headnode;<br />    headnode=node;<br />}</div><br /><p style="text-indent:20.45pt;"><span style="font-family:"微Y雅黑","sans-serif"">最l,我们完成一个简单的单向链表。此单向链表代码q有很多待完善的地方Q以后会修改代码q不定时更新?/span></p> <p style="margin-left:43.15pt;text-indent:-22.5pt;"><span style="font-family: 微Y雅黑, sans-serif; ">二?</span><span style="font-family:"微Y雅黑","sans-serif"">双向链表</span></p> <p style="margin-left:20.7pt; text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">双向链表的指针域有两个指针,每个数据l点分别指向直接后和直接前驱。单向链表只能从表头开始向后遍历,而双向链表不但可以从前向后遍历,也可以从后向前遍历。除了双向遍历的优点Q双向链表的删除的时间复杂度会降为OQ?Q,因ؓ直接通过目的指针可以找到前p点,单向链表得从表头开始遍历寻扑։p炏V缺Ҏ(gu)每个节点多了一个指针的I间开销。如?是一个双向链表?/span></p><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/list_6.png" width="813" height="236" alt="" /><br /><br /><p style="margin-left:43.15pt;text-indent:-22.5pt;"><span style="font-family:"微Y雅黑","sans-serif";">三?</span><span style="font-family:"微Y雅黑","sans-serif"">循环链表</span></p> <p style="margin-left:20.7pt; text-indent:21.0pt;"><span style="font-family:"微Y雅黑","sans-serif"">循环链表是让链表的最后一个节Ҏ(gu)向第一个节点,q样Ş成了一个圆环,可以循环遍历。单向@环链表可以单向@环遍历,双向循环链表的头节点的指针也要指向最后一个节点,q样的可以双向@环遍历。如?是一个双向@环链表?/span></p><img src="http://www.shnenglu.com/images/cppblog_com/cxiaojia/list_7.png" width="736" height="257" alt="" /><br /><p> </p><p style="margin-left:43.15pt;text-indent:-22.5pt;"><span style="font-family:"微Y雅黑","sans-serif";">四?</span><span style="font-family:"微Y雅黑","sans-serif"">链表相关问题</span></p> <p style="margin-top:1.85pt;margin-right:0cm;margin-bottom:1.85pt;margin-left: 20.7pt;text-indent:5.55pt;line-height:12.15pt;background:white"><span style="font-size: 10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">1</span><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">、如何判断一个单链表有环</span></p> <p style="margin-top:1.85pt;margin-right:0cm;margin-bottom:1.85pt;margin-left: 0cm;text-indent:20.65pt;line-height:12.15pt;background:white"><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">  2</span><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">、如何判断一个环的入口点在哪?/span></p> <p style="margin-top:1.85pt;margin-right:0cm;margin-bottom:1.85pt;margin-left: 20.65pt;line-height:12.15pt;background:white"><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">  3</span><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">、如何知道环的长?/span></p> <p style="margin-top:1.85pt;margin-right:0cm;margin-bottom:1.85pt;margin-left: 20.65pt;line-height:12.15pt;background:white"><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">  4</span><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">、如何知道两个单链表Q无环)是否怺</span></p> <p style="margin-top:1.85pt;margin-right:0cm;margin-bottom:1.85pt;margin-left: 20.65pt;line-height:12.15pt;background:white"><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">  5</span><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">、如果两个单链表Q无环)怺Q如何知道它们相交的W一个节Ҏ(gu)什?/span></p> <p style="margin-top:1.85pt;margin-right:0cm;margin-bottom:1.85pt;margin-left: 20.65pt;line-height:12.15pt;background:white"><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">  6</span><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">、如何知道两个单链表Q有环)是否怺</span></p> <p style="margin-top:1.85pt;margin-right:0cm;margin-bottom:1.85pt;margin-left: 20.65pt;line-height:12.15pt;background:white"><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">  7</span><span style="font-size:10.5pt;font-family:"微Y雅黑","sans-serif";Times New Roman";">、如果两个单链表Q有环)怺Q如何知道它们相交的W一个节Ҏ(gu)什?/span></p><br />       <a style="text-decoration: underline; " title="{案" target="_blank">{案</a><br /><br /><br /><img src ="http://www.shnenglu.com/cxiaojia/aggbug/185760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2012-07-31 17:41 <a href="http://www.shnenglu.com/cxiaojia/archive/2012/07/31/185760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hash_map哈希映照容器的实?/title><link>http://www.shnenglu.com/cxiaojia/archive/2012/04/18/171901.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Wed, 18 Apr 2012 12:18:00 GMT</pubDate><guid>http://www.shnenglu.com/cxiaojia/archive/2012/04/18/171901.html</guid><wfw:comment>http://www.shnenglu.com/cxiaojia/comments/171901.html</wfw:comment><comments>http://www.shnenglu.com/cxiaojia/archive/2012/04/18/171901.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/cxiaojia/comments/commentRss/171901.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/cxiaojia/services/trackbacks/171901.html</trackback:ping><description><![CDATA[<div><p>hash_map<span style="font-family: 宋体;">Q顾名思义Q就是利?/span>hash_set<span style="font-family:宋体;">存储l构的写</span>map<span style="font-family:宋体;">映照容器Q普通的</span>map<span style="font-family:宋体;">用的是红黑树存储l构写的。元素的索时间对比,</span>hash_set<span style="font-family:宋体;">q似?/span>O(1)<span style="font-family:宋体;">Q红黑树?/span>O(logn)<span style="font-family:宋体;">?/span>Hash_map<span style="font-family:宋体;">的空间开销要比</span>map <span style="font-family:宋体;">的空间开销大,其是我用数l模拟指针写?/span>hash_map<span style="font-family:宋体;">?/span></p> <p><span style="font-family:宋体;">所以,如果有必要采取映结构的时候,能用</span>hash_map<span style="font-family:宋体;">别?/span>map<span style="font-family:宋体;">?/span></p> <p><span style="font-family:宋体;">需要注意的是,</span>hash_map<span style="font-family:宋体;">遍历出来的元素不是有序的?/span></p> <p>Hash_map<span style="font-family: 宋体;">和普?/span>hash_set<span style="font-family:宋体;">相比的话Q?/span>hash_map<span style="font-family:宋体;">?/span>hash_set<span style="font-family:宋体;">多了一?/span>value<span style="font-family:宋体;">表,也就是映表?/span></p> <p> </p> <p><span style="font-family:宋体;">下面?/span>hash_map<span style="font-family:宋体;">的模板,?/span>hash_set<span style="font-family: 宋体; ">的模板差不多?br /><br /></span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->template<<span style="color: #0000FF; ">class</span> KeyType,<span style="color: #0000FF; ">int</span> MaxHash><br /><span style="color: #0000FF; ">struct</span> HashFunction<br />{<br />    <span style="color: #0000FF; ">int</span> <span style="color: #0000FF; ">operator</span>()(<span style="color: #0000FF; ">const</span> KeyType& key)<br />    {<br />        <span style="color: #0000FF; ">int</span> h=key%MaxHash;<br />        <span style="color: #0000FF; ">if</span> (h<0) h+=MaxHash;<br />        <span style="color: #0000FF; ">return</span> h;<br />    }<br />};<br /><br />template<<span style="color: #0000FF; ">class</span> KeyType,<span style="color: #0000FF; ">class</span> ValueType,<span style="color: #0000FF; ">int</span> KeyContain,<span style="color: #0000FF; ">int</span> MaxHash,<span style="color: #0000FF; ">class</span> HashFun=HashFunction<KeyType,MaxHash> ><br /><span style="color: #0000FF; ">class</span> HashMap<br />{<br /><span style="color: #0000FF; ">public</span>:<br />    HashMap():hashfun(){Clear();}<br />    ValueType& <span style="color: #0000FF; ">operator</span>[](<span style="color: #0000FF; ">const</span> KeyType& key)<br />    {<br />        <span style="color: #0000FF; ">int</span> h=hashfun(key);<br />        <span style="color: #0000FF; ">int</span> pos=head[h];<br />        <span style="color: #0000FF; ">for</span>(;pos!=0;pos=next[pos])<br />        {<br />            <span style="color: #0000FF; ">if</span>(keys[pos]==key)<br />                <span style="color: #0000FF; ">return</span> values[pos];<br />        }<br />        next[++top]=head[h];<br />        head[h]=top;<br />        keys[top]=key;<br />        values[top]=ValueType();<span style="color: #008000; ">//</span><span style="color: #008000; ">初始?/span><span style="color: #008000; "><br /></span>        ++sz;<br />        <span style="color: #0000FF; ">return</span> values[top];<br />    }<br />    <span style="color: #0000FF; ">void</span> Clear()<br />    {<br />        memset(head,0,<span style="color: #0000FF; ">sizeof</span>(head));<br />        memset(next,0,(top+1)*<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">int</span>));<br />        top=0;<br />        sz=0;<br />    }<br />    unsigned <span style="color: #0000FF; ">int</span> size() <span style="color: #0000FF; ">const</span> {<span style="color: #0000FF; ">return</span> sz;}<br /><br /><span style="color: #0000FF; ">private</span>:<br />    unsigned <span style="color: #0000FF; ">int</span> sz;<br />    HashFun hashfun;<br />    <span style="color: #0000FF; ">int</span> head[MaxHash];<br />    <span style="color: #0000FF; ">int</span> next[KeyContain];<br />    KeyType keys[KeyContain];<br />    ValueType values[KeyContain];<br />    <span style="color: #0000FF; ">int</span> top;<br />};</div><p> </p></div><img src ="http://www.shnenglu.com/cxiaojia/aggbug/171901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2012-04-18 20:18 <a href="http://www.shnenglu.com/cxiaojia/archive/2012/04/18/171901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>区间某个数出现的ơ数http://www.shnenglu.com/cxiaojia/archive/2012/03/26/168993.htmlC加C加Mon, 26 Mar 2012 04:55:00 GMThttp://www.shnenglu.com/cxiaojia/archive/2012/03/26/168993.htmlhttp://www.shnenglu.com/cxiaojia/comments/168993.htmlhttp://www.shnenglu.com/cxiaojia/archive/2012/03/26/168993.html#Feedback0http://www.shnenglu.com/cxiaojia/comments/commentRss/168993.htmlhttp://www.shnenglu.com/cxiaojia/services/trackbacks/168993.html

l你一串数字,让你求出某个子串中某个数字出现的ơ数?/span>

用邻接表储存每个数出现的位置Q然后对L表进行二分查找,扑և区间?/span>



C加 2012-03-26 12:55 发表评论
]]>
优秀博客推荐Q各U数据结构与法知识入门l典Q不断更?http://www.shnenglu.com/cxiaojia/archive/2011/11/16/rumen.htmlC加C加Wed, 16 Nov 2011 07:58:00 GMThttp://www.shnenglu.com/cxiaojia/archive/2011/11/16/rumen.htmlhttp://www.shnenglu.com/cxiaojia/comments/160269.htmlhttp://www.shnenglu.com/cxiaojia/archive/2011/11/16/rumen.html#Feedback7http://www.shnenglu.com/cxiaojia/comments/commentRss/160269.htmlhttp://www.shnenglu.com/cxiaojia/services/trackbacks/160269.html

 

作者:C加 更新旉Q?/span>2012-8-16

Ƣ迎自荐?span style="color: red; ">推荐链接。请于留a处告知?br />
基本法
贪心法Q?a title="贪心法" target="_blank">贪心法 作者:独酌途R
               贪心法_讲 
作者:3522021224
递归和分治:递归与分ȝ?/a> 作者:zhoudaxia

图论
囄遍历QDFS和BFSQ:  
囄遍历 作者:jefferent
最生成树QPrim法和Kruskal法Q: 贪心法--最生成树 作者:独酌途R
Dijkstra法Q?nbsp;最短\径之Dijkstra法详细讲解 作者:l岩
                   最短\径算?#8212;Dijkstra(q杰斯特?法分析与实?C/C++) 作者:tankywoo
Bellman-Ford法Q?a title="最短\径算?#8212;Bellman-Ford(贝尔?特)法分析与实?C/C++)" target="_blank">最短\径算?#8212;Bellman-Ford(贝尔?特)法分析与实?C/C++)  作者:tankywoo
Floyd-Warshall法Q?a title="最短\径算?#8212;Floyd(弗洛伊d)法分析与实?C/C++)">最短\径算?#8212;Floyd(弗洛伊d)法分析与实?C/C++) 作者:tankywoo
Johnson法Q?a title="Johnson 法">Johnson 法 作者:huliang82
A*法Q?/span>A*法详解 作者:愚h有节
拓扑排序Q?a title="拓扑排序">拓扑排序  作者:
midgard

              如何ȝ?拓扑排序法 作者:张善?/strong>
关键路径Q?a title="关键路径" target="_blank">关键路径 作者:navorse
Ƨ拉路:Ƨ拉路问?/a> 作者:MaiK
差分U束Q?a title="差分U束pȝ">差分U束pȝ 作者:fuliang
二分图最大匹配:二分囑֌配ȝ 作者:北极天南?br />                           二分囑֌配算法ȝ 作者:z7m8v6
|络:|络基 作者:chhaj523

数据l构
链表:基本数据l构Q链表(listQ?/span> 作?C加
?
基本数据l构Q栈QstackQ?/a> 作?C加 
队列:
基本数据l构Q队列(queueQ?/a> 作?C加 
 ?
基本数据l构Q树QtreeQ?/a> 作?C加  
二叉?
C加 
二叉查找?
一步一步写二叉查找?/a>  作?C加  
q查集:
q查?-学习详解 作者:yx_th000
哈希表:猎h?/span>
二分查找Q?a title="查找Q二Q:二分查找">查找Q二Q:二分查找
 作者:xiaosuo
哈夫曼树Q?/span>哈夫曼树 作者:angle
q二叉树: q二叉树(解惑Q?/a> 作者:Never
树状数组Q?a target="_blank">树状数组ȝ 作者:熊猫yingcai
U段树: U段树ȝ 作者:星星
归ƈ排序求逆序敎ͼkahn


动态规划(DPQ?/span>
单动态规划:brokencode

背包问题Q《背包九(ji)讌Ӏ?br />

数学
遗传法Q?nbsp;遗传法入门 作者:heaad
Ҏ(gu)原理Q?a href="http://www.shnenglu.com/vici/archive/2011/09/05/155103.html" title="Ҏ(gu)原理Q翻译)" target="_blank">Ҏ(gu)原理Q翻译) 作者:vici
母函敎ͼ母函数入门小l?/a> 作者:zhangxiang0125
U九(ji)韶算法:
simonezhlx

高斯消元法:
Ƨ几里得定理QGCDQ:
扩展Ƨ几里得定理Q?/span>
中国剩余定理Q?/span>
概率问题Q?/span>

计算几何
几何公式Q?br />L化: 
什么是L化? 作者:matrix67
扫描U算法:
叉积和点U:
凸包Q?br />




C加 2011-11-16 15:58 发表评论
]]>
KMP法中关于next数组的探I?/title><link>http://www.shnenglu.com/cxiaojia/archive/2011/09/20/kmp.html</link><dc:creator>C加</dc:creator><author>C加</author><pubDate>Tue, 20 Sep 2011 10:11:00 GMT</pubDate><guid>http://www.shnenglu.com/cxiaojia/archive/2011/09/20/kmp.html</guid><wfw:comment>http://www.shnenglu.com/cxiaojia/comments/156343.html</wfw:comment><comments>http://www.shnenglu.com/cxiaojia/archive/2011/09/20/kmp.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.shnenglu.com/cxiaojia/comments/commentRss/156343.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/cxiaojia/services/trackbacks/156343.html</trackback:ping><description><![CDATA[     摘要: 从《严书》上看到了KMP法Q看了一遍没懂,但觉得挺奇的,p费了几天旉深入的理解。算法的原理其实不难Q难的就是那个y妙的next数组Q这个next数组很吸引我Q我的大部分旉也都是花费在q个数组上面的。这个next数组是KMP里面一个很关键的地方,对于在数据结构书上看q一遍整个算法流E的人,能够把next数组搞明白,整个KMP法的整体思想差不多理解了。然后在一些细节上面深入思考一下,可...  <a href='http://www.shnenglu.com/cxiaojia/archive/2011/09/20/kmp.html'>阅读全文</a><img src ="http://www.shnenglu.com/cxiaojia/aggbug/156343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/cxiaojia/" target="_blank">C加</a> 2011-09-20 18:11 <a href="http://www.shnenglu.com/cxiaojia/archive/2011/09/20/kmp.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.wtx123.cn" target="_blank">ݺɫݺɫۺϾþ </a>| <a href="http://www.ffwfwj.cn" target="_blank">ƷþþþóѶ</a>| <a href="http://www.sfttc.cn" target="_blank">ھƷþþþþþþõӰ</a>| <a href="http://www.ya74.cn" target="_blank">ɫۺϾþ</a>| <a href="http://www.sjpeixun.cn" target="_blank">ɫۺϾþ</a>| <a href="http://www.gzkyzc.com.cn" target="_blank">þòӰ</a>| <a href="http://www.hedaji.cn" target="_blank">Ʒþþþù</a>| <a href="http://www.qeckf.cn" target="_blank">ھƷžžþþƷ</a>| <a href="http://www.pikajing.cn" target="_blank">99þù޸ۿ2024 </a>| <a href="http://www.grcooling.com.cn" target="_blank">ŷպĻþþò </a>| <a href="http://www.aving.com.cn" target="_blank">žžƷ99þþ㽶</a>| <a href="http://www.tianyicpa.com.cn" target="_blank">69Ʒþþþ99</a>| <a href="http://www.e9ir544.cn" target="_blank">ݺۺϾþAVһ</a>| <a href="http://www.taobaoke.net.cn" target="_blank">ɫۺϾþ۾Ʒ</a>| <a href="http://www.xyjsj88.com.cn" target="_blank">77777ҹþö</a>| <a href="http://www.lmgv.cn" target="_blank">þþƷһ</a>| <a href="http://www.csrencaiwd.cn" target="_blank">AVþ</a>| <a href="http://www.py63.cn" target="_blank">һձ˾þۺӰ</a>| <a href="http://www.lstweb.cn" target="_blank">޹˾þۺ3d</a>| <a href="http://www.kkfo.cn" target="_blank">˾þô߽AVɫɫ</a>| <a href="http://www.51083114.cn" target="_blank">91ƷùۺϾþ</a>| <a href="http://www.seese.cn" target="_blank">Ůþþùһ</a>| <a href="http://www.cu76.cn" target="_blank">þۺϳDž</a>| <a href="http://www.material7.cn" target="_blank">ձɫۺϾþӰԺ</a>| <a href="http://www.crs24.cn" target="_blank">þùƷHDAV</a>| <a href="http://www.tabuluo.com.cn" target="_blank">þþƷԴվ</a>| <a href="http://www.rytaoshumiao.cn" target="_blank">þþƷav٤</a>| <a href="http://www.marsit.cn" target="_blank">þó˹Ʒ</a>| <a href="http://www.wzcl818.cn" target="_blank">99þþƷ鶹</a>| <a href="http://www.ctihf.com.cn" target="_blank">þþþþŮ</a>| <a href="http://www.9ii8.cn" target="_blank">˾þþƷӰԺ</a>| <a href="http://www.seomog.cn" target="_blank">þ</a>| <a href="http://www.nmgbetl.cn" target="_blank">þþþרav</a>| <a href="http://www.antispy.cn" target="_blank">Ʒvaþþþþþ</a>| <a href="http://www.iaicy.cn" target="_blank">þþƷĻ</a>| <a href="http://www.inqh.cn" target="_blank">޾þþþþ77777</a>| <a href="http://www.beo.net.cn" target="_blank">Ʒþ¶</a>| <a href="http://www.sansiwu.cn" target="_blank">þֻǾƷ66</a>| <a href="http://www.inqh.cn" target="_blank">þþþѾƷ</a>| <a href="http://www.jhitezpt.cn" target="_blank">ŷ˾þۺһ</a>| <a href="http://www.zghzmj.com.cn" target="_blank">þþƷҹҹŷ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>