C++ 实现单链表

C++ 实现单链表

基本思路

首先创建一个结点类,在单链表中需要有头结点、尾结点、当前结点、结点数目,此处将head头结点定义为一个不带值的结点,同时将其下标设置为0,这样就做到了插入的是第几个元素,则该元素下标就是多少,curr指当前节点的前一个结点,这样方便结点的插入。

代码实现

#include <iostream>
using namespace std;

template <typename T>
class Node
{
public:
    T value;
    Node *next;

    Node(Node *next = NULL)
    {
        this->next = next;
    }

    Node(T value, Node *next = NULL)
    {
        this->value = value;
        this->next = next;
    }
};

template <typename T>
class SinglyLinkedList
{
private:
    Node<T> *head;
    Node<T> *curr;
    Node<T> *tail;
    int length;

public:
    SinglyLinkedList()
    {
        head = curr = tail = new Node<T>();
        length = 1;
    }

    void append(T value)
    {
        tail->next = new Node<T>(value, NULL);
        tail = tail->next;
        length++;
    }

    void clear()
    {
        while (head)
        {
            Node<T> *temp = head;
            head = head->next;
            delete (temp);
        }
        length = 0;
    }

    T getValue()
    {
        if (curr->next == NULL)
            throw runtime_error("没有元素");
        return curr->next->value;
    }

    int getCurrPosition()
    {
        Node<T> *temp = head;
        int i;
        for (i = 0; temp != curr; i++)
        {
            temp = temp->next;
        }
        return i;
    }

    void insert(T value)
    {
        curr->next = new Node<T>(value, curr->next);
        if (tail == curr)
            tail = curr->next;
        length++;
    }

    void moveToPosition(int pos)
    {
        if (pos < 0 || pos >= length)
        {
            cout << "位置有误,无法进行移动" << endl;
            return;
        }
        curr = head;
        for (int i = 0; i != pos; i++)
        {
            curr = curr->next;
        }
    }

    void moveToStart()
    {
        curr = head;
    }

    void moveToEnd()
    {
        curr = tail;
    }

    void next()
    {
        if (curr != tail)
            curr = curr->next;
    }

    void prev()
    {
        if (curr == head)
            return;
        Node<T> *temp = head;
        while (temp->next != curr)
        {
            temp = temp->next;
        }
        curr = temp;
    }

    void remove()
    {
        if (curr->next == NULL)
        {
            cout << "没有元素" << endl;
            return;
        }
        Node<T> *temp = curr->next;
        if (tail = temp)
            tail = curr;
        curr->next = curr->next->next;
        delete (temp);
        length--;
    }

    int size()
    {
        return length;
    }
};

int main()
{
    SinglyLinkedList<int> s;
    s.append(1);
    s.append(2);
    s.append(3);
    s.append(4);
    s.append(5);
    s.append(6);
    cout << s.size() << endl;
    int index = 4;
    s.moveToPosition(index);
    while (index++ < s.size() - 1)
    {
        cout << s.getValue() << endl;
        s.next();
        cout << "index" << index << endl;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值