一个“链表”类,大家给点意见吧

类别:编程语言 点击:0 评论:0 推荐:

下面是本人编写的一个“链表”类,大家给点意见吧。


首先是“链表”类的声明

/**********************************************
 *
 * 文件名:CLinkList.h
 *
 * 功  能:声明链表类
 *
**********************************************/

#ifndef CLINKLIST_H_
#define CLINKLIST_H_


class CLinkList //链表类
{
public:
    //一般构造函数、拷贝构造函数、赋值运算符、析构函数
    CLinkList();
    CLinkList(const CLinkList &rhs);
    CLinkList& operator=(const CLinkList &rhs);
    ~CLinkList();

    //插入
    bool Insert(int position, const char *element); //在指定位置上添加节点
    bool Insert(const char *beforeElem, const char *element); //在指定节点的前面添加节点

    //删除
    bool Delete(int position); //删除指定位置上的节点
    bool Delete(const char *element); //删除指定节点

    //修改
    bool Update(int position, const char *element); //修改指定位置上的节点
    bool Update(const char *oldElem, const char *newElem); //修改指定的节点为新的节点值

    //查找
    bool Search(const char *element, int &position); //返回指定节点在链表上的位置
    bool Search(int position, char **element); //返回指定位置上的节点

    bool Sort(void); //对链表进行排序操作(冒泡排序)

    bool Display(void); //顺序显示链表中所有节点的元素值

    inline void Count(int &nodeCount) //返回链表中所有节点的个数
    {
        nodeCount = m_count;
    };

private:
    struct Node //节点结构
    {
        struct Node *last; //指向前一个节点的指针
        char        *element; //节点元素
        struct Node *next; //指向后一个节点的指针
    };

    struct Node *m_head; //链表的表头指针

    int         m_count; //节点的个数

};


#endif

///////////////////////////////////////////////////////////////////////



下面是“链表”类的实现

/**********************************************
 *
 * 文件名:CLinkList.cpp
 *
 * 功  能:实现链表类的各种操作
 *
**********************************************/

#include <iostream>
#include "CLinkList.h"

using namespace std;


//一般构造函数
CLinkList::CLinkList()
:m_count(0),m_head(NULL)
{
    m_head = new Node; //申请表头指针的内存空间
    if (m_head != NULL) //申请成功
    {
        //初始化表头指针
        m_head->last = NULL;
        m_head->element = NULL;
        m_head->next = NULL;
    }
    else //申请失败
    {
        m_head = NULL;
    }

}


//拷贝构造函数
CLinkList::CLinkList(const CLinkList &rhs)
:m_count(0),m_head(NULL)
{
    int len = 0;

    //临时的节点指针
    struct Node *temp = NULL;
    struct Node *back = NULL;

    m_head = new Node; //申请表头指针的内存空间
    if (m_head != NULL) //申请成功
    {
        //初始化表头指针
        m_head->last = NULL;
        m_head->element = NULL;
        m_head->next = NULL;

        temp = rhs.m_head->next; //temp指向rhs所引用的CLinkList对象中的链表的第一个节点
        if (temp != NULL) //rhs所引用的CLinkList对象中的链表不为空
        {
            back = new Node; //为本对象中的链表的第一个节点申请内存空间
            if (back != NULL) //申请成功
            {
                m_head->next = back; //表头指针指向第一个节点

                back->last = m_head; //第一个节点指向表头指针

                //拷贝节点元素值
                len = strlen(temp->element);
                back->element = new char[len+1];
                strcpy(back->element, temp->element);

                back->next = NULL; //后继节点暂时为空

                ++m_count; //节点个数加1

                //下一个节点
                temp = temp->next; //temp指向rhs所引用的CLinkList对象中的链表的第二个节点
                while (temp != NULL) //节点存在
                {
                    back->next = new Node;
                    if (back->next != NULL) //内存申请成功
                    {
                        back->next->last = back; //指向前一个节点

                        back = back->next; //指向下一个节点

                        len = strlen(temp->element);
                        back->element = new char[len+1];
                        strcpy(back->element, temp->element);

                        back->next = NULL; //后继节点暂时为空

                        ++m_count; //节点个数加1

                        temp = temp->next; //temp指向rhs所引用的CLinkList对象中的链表的下一个节点

                    }
                    else //内存申请失败
                    {
                        break;
                    }

                } //end of while

            } //end of if

        } //end of if

    }
    else //申请失败
    {
        m_head = NULL;
    }

}


//赋值运算符
CLinkList& CLinkList::operator=(const CLinkList &rhs)
{
    int len = 0;

    //临时的节点指针
    struct Node *temp = NULL;
    struct Node *back = NULL;

    if (this != &rhs) //检查是否自赋值
    {

        //删除m_head指向的链表原有的所有节点

        temp = m_head->next; //temp指向本对象中的链表的第一个节点
        m_head->next = NULL;

        while (temp != NULL)
        {
            back = temp->next; //保存下一个节点的指针值
            delete [] temp->element; //释放节点元素值所占有的内存空间
            delete temp; //释放节点所占有的内存空间

            temp = back; //指向下一个节点
        }

        m_count = 0; //节点个数变为0

        temp = NULL;
        back = NULL;


        //拷贝rhs所引用的CLinkList对象中的链表的所有节点到当前CLinkList对象中去

        temp = rhs.m_head->next; //temp指向rhs所引用的CLinkList对象中的链表的第一个节点

        if (temp != NULL) //rhs所引用的CLinkList对象中的链表不为空
        {
            back = new Node; //为本对象中的链表的第一个节点申请内存空间
            if (back != NULL) //申请成功
            {
                m_head->next = back; //表头指针指向第一个节点

                back->last = m_head; //第一个节点指向表头指针

                //拷贝节点元素值
                len = strlen(temp->element);
                back->element = new char[len+1];
                strcpy(back->element, temp->element);

                back->next = NULL; //暂时没有后继节点

                ++m_count; //节点个数加1

                //下一个节点
                temp = temp->next; //temp指向rhs所引用的CLinkList对象中的链表的第二个节点
                while (temp != NULL)
                {
                    back->next = new Node;
                    if (back->next != NULL) //内存申请成功
                    {
                        back->next->last = back; //指向前一个节点

                        back = back->next; //指向下一个节点

                        len = strlen(temp->element);
                        back->element = new char[len+1];
                        strcpy(back->element, temp->element);

                        back->next = NULL;

                        ++m_count; //节点个数加1

                        temp = temp->next; //指向下一个节点

                    }
                    else //内存申请失败
                    {
                        break;
                    }

                } //end of while

            } //end of if

        } //end of if

    } //end of if

    return *this; //返回本对象的引用(一般用于链式的赋值)
}


//析构函数
CLinkList::~CLinkList()
{
    //临时的节点指针
    struct Node *temp = NULL;
    struct Node *back = NULL;

    if (m_head != NULL) //表头指针不为空
    {
        //删除m_head指向的链表中的所有节点

        temp = m_head->next; //指向第一个节点
   
        //释放表头指针所占有的内存空间
        delete m_head;
        m_head = NULL;

        while (temp != NULL) //节点存在
        {
            back = temp->next; //保存下一个节点的指针值
            delete [] temp->element; //释放节点元素值所占有的内存空间
            delete temp; //释放节点所占有的内存空间

            --m_count; //节点个数减1

            temp = back; //指向下一个节点

        }

    } //end of if

}

 

//在指定位置上添加节点
bool CLinkList::Insert(int position, const char *element)
{
    int index = 0;
    int len   = 0;

    //临时的节点指针
    struct Node *temp    = NULL;
    struct Node *back    = NULL;
    struct Node *newNode = NULL;


    if ((position < 1) || (position > (m_count+1))) //指定的位置不正确
    {
        return false;
    }

    if (m_head != NULL) //表头指针不为空
    {
        temp = m_head->next; //指向第一个节点


        //链表为空,没有任何节点时
        if (NULL == temp)
        {
            newNode = new Node; //为第一个节点申请内存空间
            if (newNode != NULL) //内存申请成功
            {
                m_head->next = newNode; //表头指针指向第一个节点

                newNode->last = m_head; //第一个节点指向表头指针

                //拷贝节点元素值
                len = strlen(element);
                newNode->element = new char[len+1];
                strcpy(newNode->element, element);

                newNode->next = NULL; //没有后继节点

                ++m_count; //节点个数加1

                return true;

            }
            else //内存申请失败
            {
                return false;
            }

        } //end of if


        //在 1、1与m_count之间、m_count 位置上插入节点时
        while (temp != NULL)
        {
            ++index;

            if (position == index) //找到匹配的位置
            {
                newNode = new Node; //为插入的节点申请内存空间
                if (newNode != NULL) //内存申请成功
                {
                    temp->last->next = newNode; //使前一个节点指向新创建的节点

                    newNode->last = temp->last; //使新创建的节点指向前一个节点

                    //拷贝节点元素值
                    len = strlen(element);
                    newNode->element = new char[len+1];
                    strcpy(newNode->element, element);

                    newNode->next = temp; //使新创建的节点指向该位置上原来的节点,即现在的下一个节点。

                    temp->last = newNode; //该位置上原来的节点(即现在的下一个节点)指向新创建的节点

                    ++m_count; //节点个数加1

                    return true;

                }
                else //内存申请失败
                {
                    return false;
                }

            } //end of if

            back = temp; //保存前一个节点的指针
            temp = temp->next; //指向下一个节点

        } //end of while

        //在位置 m_count+1 上插入节点时
        newNode = new Node; //为插入的节点申请内存空间
        if (newNode != NULL) //内存申请成功
        {
            back->next = newNode; //使前一个节点指向新创建的节点

            newNode->last = back; //使新创建的节点指向前一个节点

            //拷贝节点元素值
            len = strlen(element);
            newNode->element = new char[len+1];
            strcpy(newNode->element, element);

            newNode->next = NULL; //没有后继节点

            ++m_count; //节点个数加1

            return true;

        }
        else //内存申请失败
        {
            return false;
        }

    }
    else //表头指针为空
    {
        return false;
    }

}

 

//在指定节点的前面添加节点
bool CLinkList::Insert(const char *beforeElem, const char *element)
{
    int len = 0;

    //临时的节点指针
    struct Node *temp    = NULL;
    struct Node *newNode = NULL;

    if (m_head != NULL) //表头指针不为空
    {
        temp = m_head->next; //指向第一个节点
        if (NULL == temp) //链表为空,没有任何节点
        {
            return false;
        }
        else //链表不为空
        {
            while (temp != NULL)
            {
                if (strcmp(beforeElem, temp->element) == 0) //找到匹配的节点
                {
                    newNode = new Node; //为插入的节点申请内存空间
                    if (newNode != NULL) //申请成功
                    {
                        temp->last->next = newNode; //使前一个节点指向新创建的节点

                        newNode->last = temp->last; //使新创建的节点指向前一个节点

                        //拷贝节点元素值
                        len = strlen(element);
                        newNode->element = new char[len+1];
                        strcpy(newNode->element, element);

                        newNode->next = temp; //使新创建的节点指向下一个节点

                        temp->last = newNode; //使下一个节点指向新创建的节点

                        ++m_count; //节点个数加1

                        return true;

                    }
                    else //内存申请失败
                    {
                        return false;
                    }

                } //end of if

                temp = temp->next; //指向下一个节点

            }

            return false; //找不到匹配的节点时返回false

        }

    }
    else //表头指针为空
    {
        return false;
    }

}


//删除指定位置上的节点
bool CLinkList::Delete(int position)
{
    int index = 0;

    struct Node *temp = NULL; //临时的节点指针

    if ((position < 1) || (position > m_count)) //指定的位置不正确
    {
        return false;
    }

    if (m_head != NULL) //表头指针不为空
    {
        temp = m_head->next; //指向第一个节点
        if (temp != NULL) //链表不为空
        {
            while (temp != NULL)
            {
                ++index;

                if (position == index) //找到匹配的位置
                {
                    temp->last->next = temp->next; //使前一个节点指向下一个节点

                    if (temp->next != NULL) //存在下一个节点
                    {
                        temp->next->last = temp->last; //使下一个节点指向前一个节点
                    }

                    //释放要被删除的节点所占用的内存空间
                    delete [] temp->element;
                    delete temp;

                    --m_count; //节点个数减1

                    return true;

                }

                temp = temp->next; //指向下一个节点

            } //end of while

   return false;

        }
        else //链表为空
        {
            return false;
        }

    }
    else //表头指针为空
    {
        return false;
    }

}


//删除指定节点
bool CLinkList::Delete(const char *element)
{
    struct Node *temp = NULL; //临时的节点指针

    if (m_head != NULL) //表头指针不为空
    {
        temp = m_head->next; //指向第一个节点
        if (temp != NULL) //链表不为空
        {
            while (temp != NULL)
            {
                if (strcmp(element, temp->element) == 0) //找到匹配的节点
                {
                    temp->last->next = temp->next; //使前一个节点指向下一个节点

                    if (temp->next != NULL) //存在下一个节点
                    {
                        temp->next->last = temp->last; //使下一个节点指向前一个节点
                    }

                    //释放要被删除的节点所占用的内存空间
                    delete [] temp->element;
                    delete temp;

                    --m_count; //节点个数减1

                    return true;

                } //end of if

                temp = temp->next; //指向下一个节点

            } //end of while

            return false; //找不到匹配的节点时返回false

        }
        else //链表为空
        {
            return false;
        }

    }
    else //表头指针为空
    {
        return false;
    }

}

 

//修改指定位置上的节点
bool CLinkList::Update(int position, const char *element)
{
    int index = 0;
    int len   = 0;

    struct Node *temp = NULL; //临时的节点指针

    if ((position < 1) || (position > m_count)) //指定的位置不正确
    {
        return false;
    }

    if (m_head != NULL) //表头指针不为空
    {
        temp = m_head->next; //指向第一个节点
        if (temp != NULL) //链表不为空
        {
            while (temp != NULL)
            {
                ++index;

                if (position == index) //找到匹配的位置
                {
                    //释放原来节点元素值占有的内存空间
                    delete [] temp->element;
                    temp->element = NULL;

                    //拷贝新的节点元素值
                    len = strlen(element);
                    temp->element = new char[len+1];
                    strcpy(temp->element, element);

                    return true;

                } //end of if

                temp = temp->next; //指向下一个节点

            } //end of while

   return false;

        }
        else //链表为空
        {
            return false;
        }

    }
    else //表头指针为空
    {
        return false;
    }

}

 

//修改指定的节点为新的节点值
bool CLinkList::Update(const char *oldElem, const char *newElem)
{
    int len = 0;

    struct Node *temp = NULL; //临时的节点指针

    if (m_head != NULL) //表头指针不为空
    {
        temp = m_head->next; //指向第一个节点
        if (temp != NULL) //链表不为空
        {
            while (temp != NULL)
            {
                if (strcmp(oldElem, temp->element) == 0) //找到匹配的节点
                {
                    //释放原来节点元素值占有的内存空间
                    delete [] temp->element;
                    temp->element = NULL;

                    //拷贝新的节点元素值
                    len = strlen(newElem);
                    temp->element = new char[len+1];
                    strcpy(temp->element, newElem);

                    return true;

                }

                temp = temp->next; //指向下一个节点

            } //end of while

            return false; //找不到匹配的节点时返回false

        }
        else //链表为空
        {
            return false;
        }

    }
    else //表头指针为空
    {
        return false;
    }

}


//返回指定节点在链表上的位置
bool CLinkList::Search(const char *element, int &position)
{
    int index = 0;

    struct Node *temp = NULL; //临时的节点指针

    position = 0;

    if (m_head != NULL) //表头指针不为空
    {
        temp = m_head->next; //指向第一个节点
        if (temp != NULL) //链表不为空
        {
            while (temp != NULL)
            {
                ++index;

                if (strcmp(element, temp->element) == 0) //找到匹配的节点
                {
                    position = index; //返回指定节点的正确位置

                    return true;

                }

                temp = temp->next; //指向下一个节点

            } //end of while

            return false; //找不到匹配的节点时返回false

        }
        else //链表为空
        {
            return false;
        }

    }
    else //表头指针为空
    {
        return false;
    }

}


//返回指定位置上的节点元素
bool CLinkList::Search(int position, char **element)
{
    int index = 0;
    int len   = 0;

    struct Node *temp = NULL; //临时的节点指针

    if ((position < 1) || (position > m_count)) //指定的位置不正确
    {
        return false;
    }

    if (m_head != NULL) //表头指针不为空
    {
        temp = m_head->next; //指向第一个节点
        if (temp != NULL) //链表不为空
        {
            while (temp != NULL)
            {
                ++index;

                if (position == index) //找到匹配的位置
                {
                    //返回找到的节点元素值
                    strcpy(*element, temp->element);

                    return true;

                } //end of if

                temp = temp->next; //指向下一个节点

            } //end of while

            return false;

        }
        else //链表为空
        {
            return false;
        }

    }
    else //表头指针为空
    {
        return false;
    }

}


bool CLinkList::Sort(void) //对链表进行排序操作(冒泡排序)
{
    int  len       = 0;
    char *tempElem = NULL;

    //临时的节点指针
    struct Node *temp = NULL;
    struct Node *back = NULL;

    if (m_head != NULL) //表头指针不为空
    {
        temp = m_head->next; //指向第一个节点
        if (temp != NULL) //链表不为空
        {
            while (temp != NULL)
            {
                back = temp->next; //back 指向 temp 所指向的节点的下一个节点
                while (back != NULL)
                {
                    //temp->element 大于 back->element,两个节点元素之间交换
                    if (strcmp(temp->element, back->element) > 0)
                    {
                        //拷贝temp->element所指向的节点元素值到tempElem所指向的内存空间中去
                        len = strlen(temp->element);
                        tempElem = new char [len+1];
                        strcpy(tempElem, temp->element);

                        delete [] temp->element;
                        temp->element = NULL;
                        len = 0;

                        //拷贝back->element所指向的节点元素值到temp->element所指向的内存空间中去
                        len = strlen(back->element);
                        temp->element = new char [len+1];
                        strcpy(temp->element, back->element);

                        delete [] back->element;
                        back->element = NULL;
                        len = 0;

                        //拷贝tempElem所指向的节点元素值到back->element所指向的内存空间中去
                        len = strlen(tempElem);
                        back->element = new char [len+1];
                        strcpy(back->element, tempElem);

                        delete [] tempElem;
                        tempElem = NULL;
                        len = 0;

                    } //end of if

                    back = back->next; //back 指向下一个节点

                } //end of while

                temp = temp->next; //temp 指向下一个节点

            } //end of while

            return true; //排序完成就返回true

        }
        else //链表为空
        {
            return false;
        }

    }
    else //表头指针为空
    {
        return false;
    }

}

 

//顺序显示链表中所有节点的元素值
bool CLinkList::Display(void)
{
    struct Node *temp = NULL; //临时的节点指针

    if (m_head != NULL) //表头指针不为空
    {
        temp = m_head->next; //指向第一个节点
        if (NULL == temp) //链表为空
        {
            return false;
        }

        //顺序输出各节点的元素值
        while (temp != NULL)
        {
            cout << temp->element << '\t';
            temp = temp->next; //指向下一个节点
        }

        cout << endl;

        return true;

    }
    else //表头指针为空
    {
        return false;
    }

}

///////////////////////////////////////////////////////////////////////////

本文地址:http://com.8s8s.com/it/it26728.htm