线性表(带头结点的单链表)

node.h

#pragma once
template<typename T>
class node
{
public:
    node() = default;//默认构造函数

    node(T x) :elem(x),next(NULL) {};
    T elem; //节点元素
    node *next;
};

linkList.h

#pragma once
# include"node.h"
# include<iostream>
# include<string>
using std::cout;
using std::endl;

template<typename T>
class linkList
{
public:
    linkList();//默认构造函数
    ~linkList();//析构函数,删除整个链表,包括头结点
    void clearList();   //清空链表(只是清空其他节点,保留头结点)
    int linkLen();  //链表长度(节点个数)
    bool empty();   //链表是否为空

    bool getElem(int i,node<T>*&p);//返回指向第i个节点的指针
    int locateElem(node<T> *p); //节点node在链表中的位置

    void traverse();    //遍历链表

    bool insert(int i,T x); //在第i个位置之后插入节点
    bool dele(int i);   //删除第i个位置上的节点
    void push_back(T x);    //在链表尾部插入节点

private:
    node<T> *head;//头指针
    int iLen;   //节点个数(头结点除外)
};


//==============函数实现=======================
template<typename T>
linkList<T>::linkList():head(new node<T>()),iLen(0)//默认构造函数
{

}

template<typename T>
linkList<T>::~linkList()//析构函数
{
    clearList();
    delete head;
}

template<typename T>
void linkList<T>::clearList()   //清空链表(只是清空节点,保留头结点)
{
    node<T>* p1 = head;
    for (node<T> *p = head->next;p;)
    {
        p1= p;
        p = p1->next;
        delete p1;

    }
    head->next = NULL;
    iLen = 0;
}

template<typename T>
int linkList<T>::linkLen()  //链表长度(节点个数)
{
    return iLen;
}

template<typename T>
bool linkList<T>::empty()   //链表是否为空
{
    return iLen == 0;
}

template<typename T>
bool linkList<T>::getElem(int i, node<T>*&p)//获得指向第i个节点的指针
{
    if (i<1 || i>iLen)
        return false;
    p = head;
    for (int j = 1;j < i;j++)
    {
        p = p->next;
    }
    p = p->next;
    return true;
}

template<typename T>
int linkList<T>::locateElem(node<T> *p) //节点node在链表中的位置
{
    int i = 0;
    node<T> *p1;
    for (p1 = head->next;p1 != p;p1 = p1->next)
    {
        i++;
    }
    return ++i;
}

template<typename T>
void linkList<T>::traverse()    //遍历链表
{
    for (node<T> *p = head->next;p;p = p->next)
        cout << p->elem << endl;
}

template<typename T>
bool linkList<T>::insert(int i,T x) //在第i个位置之后插入节点
{
    node<T> *p;
    if (!getElem(i, p))
        return false;
    node <T> *p1 = p->next;
    node<T> *pNew = new node<T>(x);
    p->next = pNew;
    pNew->next = p1;
    iLen++;
    return true;
}

template<typename T>
bool linkList<T>::dele(int i)   //删除第i个位置上的节点
{
    node<T> *p;
    if (!getElem(i - 1, p))
        return false;
    node<T> *p1=p->next;
    p->next = p1->next;
    delete p1;
    iLen--;
    return true;
}

template<typename T>
void linkList<T>::push_back(T x)    //在链表尾部插入节点
{
    node<T> *p, *p1;
    for (p = head;p->next;p = p->next)
    {
    }
    p1 = new node<T>(x);
    p->next = p1;
    iLen++;

}

main.cpp

# include<iostream>
# include"node.h"
# include"linkList.h"

using namespace std;

int main()
{
    linkList<int> myList;
    myList.push_back(1);
    myList.push_back(3);
    myList.push_back(5);
    node<int> *p;
    myList.getElem(2, p);
    myList.insert(1, 2);
    myList.locateElem(p);

    myList.traverse();
    system("pause");
    return 0;
}

运行结果:
这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值