使用C++实现单向链表

简介: 版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/44682245 不多...
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/44682245

不多说了,直接上代码:

注意:其中的Exception类请参考我的《使用C++实现的线性表》

#ifndef CHAIN_H
#define CHAIN_H

#include 
#include "Exception.h"

template
class  ChainNode;

template
class ChainIterator;

template
class Chain
{
    friend class ChainIterator;
public:
    Chain(){head = 0;}
    ~Chain();
    bool isEmpty() const { return head == 0;}
    int Length() const;
    bool Find(int k,T& x) const;
    int Search(const T& x) const;
    Chain& Delete(int pos,T& x);
    Chain& Insert(int pos,const T& x);
    Chain& add(const T& x);     //在链表的尾部添加一个元素
    void clear();                  //清楚链表中的元素
    T& get(int x);              //获取在x位置的元素
    void print();
private:
    ChainNode *head;
};

template
class ChainNode{
    friend class Chain;
    friend class ChainIterator;
private:
    T data;
    ChainNode *next;
};

/**链表遍历器**/
template
class ChainIterator{
public:
    T* initialize(const Chain& c){
        location = c.head;

        if(location)
            return &(location->data);
        else
            return 0;
    }

    T* Next(){
        location = location->next;
        if(location)
            return &(location->data);
        else
            return 0;
    }

private:
    ChainNode *location;
};

template
int Chain::Length() const
{
    ChainNode *current = head;

    int i  = 0;
    while(current){
        i++;
        current = current->next;
    }

    return i;
}

template
bool Chain::Find(int k, T &x) const
{
    ChainNode* current = head;
    int index = 1;

    while(index < k && current){
        current = current->next;
        index++;
    }

    if(current){
        x = current->data;
        return true;
    }

    return false;
}

template
int Chain::Search(const T &x) const
{
    ChainNode *current = head;
    int index = 1;

    while(current && current->data != x){
        current = current->next;
        index++;
    }

    if(current){
        return index;
    }

    return -1;
}

template
Chain& Chain::Delete(int pos, T &x)
{
    if(pos <= 0 || pos > Length())
        throw OutOfBounds();

    ChainNode* p = head;

    if(pos == 1){
        head = head->next;
    }else{
        ChainNode* q = head;

        for(int i = 1;i < pos-1 && q;i++)
            q = q->next;

        if(!q || !q->next)
            throw OutOfBounds();
        p = q->next;
        q->next = p->next;
    }

    x = p->data;
    delete p;

    return *this;
}

template
Chain& Chain::Insert(int pos, const T &x)   //在第pos个元素之后添加一个元素x
{
    if(pos < 0 || pos > Length())
        throw OutOfBounds();

    ChainNode* p = head;
    for(int i = 1;i < pos && p; i++)
        p = p->next;

    if(pos > 0 && !p)
        throw OutOfBounds();

    ChainNode* temp = new ChainNode();
     temp->data = x;
     if(pos){
         temp->next = p->next;
         p->next = temp;
     }else{
        temp->next = head;
        head = temp;
     }

    return *this;
}

template
void Chain::print()
{
    ChainNode* p = head;

    while(p){
        std::cout << p->data << "   ";
        p = p->next;
    }

    std::cout << std::endl;
}

template
Chain::~Chain()
{
    while(head){
        ChainNode* temp = head;
        head = head->next;
        delete temp;
    }

    head = 0;
}

template
Chain& Chain::add(const T &x)
{
    ChainNode *added = new ChainNode();
    added->data = x;
    added->next = 0;

    ChainNode *current = head;
    ChainNode *temp = current;

    while(current){
        temp = current;
        current = current->next;
    }

    if(temp){
        temp->next = added;
    }else{
        head = added;
    }

    return *this;
}

template
void Chain::clear()
{
    ChainNode *temp;

    while(head){
        temp = head->next;
        delete head;
        head = temp;
    }

    head = 0;
}

template
T& Chain::get(int x)
{
    if(x < 0)
        throw OutOfBounds();

    ChainNode *current = head;

    for(int i = 0; i < x &&  current; i++){
        current = current->next;
    }

    if(!current)
        throw OutOfBounds();

    return current->data;
}

#endif // CHAIN_H



目录
相关文章
|
1月前
|
存储
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)(一)
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)
|
23天前
|
算法 Java
数据结构与算法学习六:单向环形链表应用实例的约瑟夫环问题
这篇文章通过单向环形链表的应用实例,详细讲解了约瑟夫环问题的解决方案,并提供了Java代码实现。
15 0
|
1月前
|
存储 缓存
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)(二)
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)
|
6月前
|
存储
数据结构第二课 -----线性表之单向链表
数据结构第二课 -----线性表之单向链表
|
3月前
|
存储 JavaScript 前端开发
JavaScript实现单向链表
JavaScript实现单向链表
21 0
|
4月前
|
存储 C++
C++的list-map链表与映射表
```markdown C++ 中的`list`和`map`提供链表和映射表功能。`list`是双向链表,支持头尾插入删除(`push_front/push_back/pop_front/pop_back`),迭代器遍历及任意位置插入删除。`map`是键值对集合,自动按键排序,支持直接通过键来添加、修改和删除元素。两者均能使用范围for循环遍历,`map`的`count`函数用于统计键值出现次数。 ```
|
5月前
|
存储 算法
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
【单向链表】数据结构——单向链表的介绍与代码实现&笔记
|
5月前
|
存储 C++
C++的list-map链表与映射表
这篇教程介绍了C++中`list`链表和`map`映射表的基本使用。`list`链表可通过`push_front()`、`push_back()`、`pop_front()`和`pop_back()`进行元素的添加和删除,使用迭代器遍历并支持在任意位置插入或删除元素。`map`是一个键值对的集合,元素自动按键值排序,可使用下标操作符或`insert()`函数插入元素,通过迭代器遍历并修改键值对,同时提供`count()`方法统计键值出现次数。教程中包含多个示例代码以帮助理解和学习。
|
5月前
|
算法 C语言
数据结构——单向链表(C语言版)
数据结构——单向链表(C语言版)
45 2