首页
社区
课程
招聘
[旧帖] [原创]分享一个 C++ 双向链表 很大。上来求指点 0.00雪花
发表于: 2016-1-4 14:31 1709

[旧帖] [原创]分享一个 C++ 双向链表 很大。上来求指点 0.00雪花

2016-1-4 14:31
1709
#ifndef _NODE_
#define _NODE_

#include"base.h"        //一些基本输入输出的 头文件
//模板类,链表--

template<class T>
class Node
{
public:
        T value;
        Node<T>* prev;//前驱
        Node<T>* next;//后继
        Node()
        {
                prev=NULL;
                next=NULL;
        }
        ~Node(){}
};

template<class T>
class LinkList
{
private:
        Node<T>* link;
        Node<T>* real;
        int len;
public:
        LinkList()
        {
                len=0;
                real=link=new Node<T>;
                link->next=NULL;
                link->prev=link;
        }
        ~LinkList()
        {
                Node<T>* pnode,*temp;
                pnode = link->next;
                while(pnode)
                {
                        temp=pnode->next;
                        delete pnode;
                        pnode=temp;
                }
                delete link;
                link=NULL;
                len =0;
        }
        int InitLink();
        // 头 尾 随机 插 改 删 等
        int PushInfoFrount(T t);
        T PopInfoFrount();
        int PushInfoReal(T t);
        T PopInfoReal();

        int InsertInfo(const int count,T t);
        T DeleteInfo(const int count);
        int SetInfo(const int count,T t);//修改
        T GetInfo(const int count);                //返回指定位置对象

        int isEmpty();
        //获得前驱 后继
        Node<T>* Next(const int count);
        Node<T>* Prev(const int count);
        int GetLen();

};

template<class T>
int LinkList<T>::GetLen()
{
        if(!isEmpty())
                return -1;
        return len;
}

template<class T>
int LinkList<T>::isEmpty()
{
        if(link == NULL)
                return false;
        return true;
}

//初始化
template<class T>
int LinkList<T>::InitLink()
       
{
                Node<T>* pnode,*temp;
                pnode = link->next;
                if(!isEmpty())
                        return false;

                while(pnode!=link || pnode!=NULL)
                {
                        temp=pnode->next;
                        delete pnode;
                        pnode=temp;
                }
                //第二种:可以使用 PopInfoFrount();
                link->prev=link;
                link->next=NULL;
                len =0;
}
//----------------------------
//头 插 头删
template<class T>
int LinkList<T>::PushInfoFrount(T t)
{
        if(!isEmpty())return 0;
        Node<T>* newNode=new Node<T>;
        newNode->value =t;
        newNode->next=link->next;
        newNode->prev=link;

        //如果是第一次插入
        if(len == 0)
        {
                link->next=newNode;
                //调整尾指针 因为如果一直头插入 real永远是最后一个,如果不调整,那他永远指向Link.
                real=newNode;
                len++;
                return true;
        }
        //否则...
        link->next->prev=newNode;
        link->next=newNode;
       
        len ++;
        return true;
}
//头 pop
template<class T>
T LinkList<T>::PopInfoFrount()
{
       
        if( !isEmpty() || GetLen()<=0 )exit(-1);
        Node<T>* pnode=link->next;
        T t=pnode->value;
       
        if(pnode->next!=NULL || pnode!=link)
                pnode->next->prev=pnode->prev;

        pnode->prev->next=pnode->next;//link->next = pnode->next;
       

        delete pnode;
        pnode =NULL;
        len --;
        //如果链表没有对象 设置尾指针
        if(len == 0)
        {
                real=link;
        }

        return t;//返回对象

}
//尾插 尾删
template<class T>
int LinkList<T>::PushInfoReal(T t)
{
        if(!isEmpty())return -1;

        Node<T>* newNode=new Node<T>;
        newNode->value=t;

        newNode->next=real->next;
        newNode->prev=real;
        real->next=newNode;
        real=newNode;
        len++;
        return true;

}
//尾部 pop
template<class T>
T LinkList<T>::PopInfoReal()
{
        if(!isEmpty()|| GetLen()==0 ) exit(-1);

        T t=real->value;
        real->prev->next=real->next;

        Node<T>* pnode=real;
        real=real->prev;//指向前驱
        delete pnode;
        pnode =NULL;
        len--;
        return t;       
}
//指定位置 插入
template<class T>
int LinkList<T>::InsertInfo(const int count,T t)
{
        if(!isEmpty()|| count<=0 || count > GetLen() ) return -1;
        int i=1;
        Node<T>* pnode=link->next;
        Node<T>* newNode=new Node<T>;
        newNode->value = t;
        while(pnode!=NULL)
        {
                if(i==count)break;
                pnode=pnode->next;
                i++;
        }
        if(pnode==NULL || i>count)return -1;

        //如果是最后一个位置
        if(pnode->next==NULL)
        {
                newNode->next=pnode->next;
                newNode->prev=pnode;
                pnode->next=newNode;
                len++;
                real=newNode;//设置尾指针
                return true;
        }
        newNode->next=pnode->next;
        newNode->prev=pnode;
        pnode->next->prev=newNode;
        pnode->next=newNode;
        len++;
        return true;

}

//给定 位置 然后删除
template<class T>
T LinkList<T>::DeleteInfo(const int count)
{
        if(!isEmpty()|| GetLen()<=0 || count > GetLen()) exit(-1);

        //如果是最后一个 直接PopInfoReal
        if(count == GetLen())
        {
                return PopInfoReal();
        }
        //如果是头 直接PopInfoFrount;
        if(count == 1)
        {
                return PopInfoFrount();
        }
        //否则执行其他位置的删除

        int i=1;
        T t;
        Node<T>* pnode;
        pnode=link->next;
        while(pnode!=NULL)
        {
                if(i == count) break;
                ++i;
                pnode=pnode->next;

        }
        if(pnode==NULL || i>count)exit(-1);
        t=pnode->value;
        pnode->next->prev=pnode->prev;
        pnode->prev->next=pnode->next;
        delete pnode;
        pnode=NULL;
        len--;
        return t;
       
}

// 修改 set
template<class T>
int LinkList<T>::SetInfo(const int count,T t)
{
        if(!isEmpty()|| GetLen==0 || count> GetLen())return -1;

        if(count == 1)
        {
                link->next->value=t;return true;
        }
        if(count == GetLen())
        {
                real->value=t;return true;
        }

        Node<T>* pnode=link->next;
        int i=1;
        while(pnode)
        {
                if(i == count)break;
                i++;
                pnode=pnode->next;
        }
        if(pnode==NULL || i>count)return -1;
        pnode->value=t;
        return true;
}

//获取指定位置 然后返回value值对象
template<class T>
T LinkList<T>::GetInfo(const int count)
{
        if(!isEmpty()|| GetLen()==0 || count > GetLen()) exit(-1);
        if(count ==1)
                return link->next->value;
        if(count==GetLen())
                return real->value;

        int i=1;
        Node<T>* pnode=link->next;
        while(pnode)
        {
                if(i == count)break;
                i++;
                pnode=pnode->next;
        }
        if(pnode == NULL || i>count)exit(-1);
        return pnode->value;
}

//获取 前驱后继 返回节点指针
template<class T>
Node<T>* LinkList<T>::Next(const int count)
{

        if(!isEmpty() || count <=0 || count>GetLen())exit(-1);

        int i=1;
        Node<T>* pnode=link;
        while(pnode)
        {
                if(i == count)break;
                i++;
                pnode =pnode->next;
        }
        if(pnode==NULL || i>count)exit(-1);

        return pnode->next;

       
}
template<class T>
Node<T>* LinkList<T>::Prev(const int count)
{
        if(!isEmpty() || count <=0 || count>GetLen())exit(-1);

        int i=1;
        Node<T>* pnode=link->next;
        while(pnode)
        {
                if(i == count)break;
                i++;
                pnode =pnode->next;
        }
        if(pnode==NULL || i>count)exit(-1);
        return pnode->prev;
}

#endif

--------------------------------
感觉是不是 太多了啊?

现在我没有干这个有关工作,明年想去试试,可是界面编程没怎么学,哎,实际工作中 一有时间 我就写代码,也没有信心去面试开发的。

不知道怎么办。反正决心是坚持走这路线的。并且 学了几年了。。一直没计划的学和发展,就写写数据结构等。没进步。

我该怎么走啊? 明年开年后 也不能把 win32或者MFC学会啊。怎么找工作 55555555

---------------------------------------------

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 58
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
我觉得数据结构什么的, stl里面都有实现,性能,稳定性什么的都比自己写的要强不知道多少倍,自己实现可以用来学习原理, 实际生产环境用处不是很大 个人感觉, 要在开发这条路上走, 关键是要学一些设计思想, 流程优化之类的东西,多使用前人的东西, 而不是重复造轮子
2016-1-8 15:12
0
雪    币: 382
活跃值: (554)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
插入效率低,可以考虑重载一下插入函数,参数是结点地址。
2016-1-9 06:55
0
游客
登录 | 注册 方可回帖
返回
//