c++链表实现头文件(带头节点)

这篇文章详细介绍了C++中链表类(link)的实现,包括链表的创建、判断是否为空、输出链表、插入、删除节点、查找元素以及链表的逆置操作。
摘要由CSDN通过智能技术生成

#include <iostream>
#include <string>
using namespace std;


typedef struct Lnode
{
    int date;
    Lnode *next;
}Lnode,*Linklist;

class link
{
public:
    link();//创建一个带头结点的空表
    bool empty();//判断是否为空
    void display();//输出链表
    void input();//头插
    void findend(Lnode * &p);//定位指向最后一个节点的指针
    Lnode* & locate(int pos);//返回链表内元素,引用接受否则无效
    Lnode* locate1(int pos);//返回指向某节点的指针(非链表内元素)
    void input1();//尾插
    void insert(int pos,int date);//插入操作操作链表内指向第j个位置的指针,非法输入插尾部
    void insert1(int pos, int date);//插入操作利用指针操作第j-1个节点,非法输入插尾部
    void back_insert(Lnode* p, int date);//指定节点后插
    void front_insert(Lnode* p, int date);//指定节点前插
    void delte(int pos);//删除元素
    int find_elem(int elem);
    void delte(Lnode* p);//删除元素不能删尾节点
    void Lnode_inv();//逆置,直接修改指针
    void Lnode_inv1();//逆置插一个删一个
private:
    Linklist L;
};

link::link()
{
    this->L = new Lnode;
    this->L->next = NULL;
}

void link::delte(Lnode* p)
{
    if (p->next != NULL)
    {
        Lnode* ptr = p->next;
        p->date = ptr->date;
        p->next = ptr->next;
        delete ptr;
    }
}

bool link::empty()
{
    return this->L->next == NULL;
}

void link::display()
{
    Lnode* ptr = this->L->next;
    int ord = 1;
    while (ptr != NULL)
    {
        cout << ord << ": " <<ptr->date << endl;
        ord += 1;
        ptr = ptr->next;
    }
}

void link::input()
{
    Lnode* ptr = new Lnode;
    string input;
    getline(cin, input);
    while (1)
    {
        try
        {
            ptr->date = stoi(input);
            ptr -> next = this->L->next;
            this->L->next = ptr;
            ptr= new Lnode;
            getline(cin, input);
        }
        catch (...)
        {
            break;
        }
    }
}


void link::findend(Lnode*& p)
{
    p = L;
    while (p->next != NULL)
    {
        p = p->next;
    }
}

void link::back_insert(Lnode* p, int date)
{
    Lnode* pnew = new Lnode;
    pnew->date = date;
    pnew->next = p->next;
    p->next = pnew;
}
//尾插
void link::input1()
{
    Lnode* pend;
    findend(pend);
    string input;
    getline(cin, input);
    while (1)
    {
        try
        {
            back_insert(pend, stoi(input));
            pend = pend->next;
            getline(cin, input);
        }
        catch (...)
        {
            break;
        }
    }
}


 


Lnode* link::locate1(int pos)
{
    Lnode* p = L;
    int ord = 0;
    while (p->next != NULL && ord < pos)
    {
        p = p->next;
        ord += 1;
     }
    return p;
}


Lnode* & link::locate(int pos)
{
    Lnode* p = L;
    int ord = 0;
    while (p->next!= NULL && ord < pos-1 )
    {
        p = p->next;
        ord += 1;
    }
    
    return p->next;
}


void link::insert(int pos, int date)
{
    Lnode* & p=locate(pos);
    Lnode* pnew = new Lnode;
    pnew->next = p;
    pnew->date = date;
    p = pnew;   
}

void link::insert1(int pos, int date)
{
    Lnode* p=locate1( pos-1);
    back_insert(p, date);
}

void link::delte(int pos)
{
    Lnode* p=locate1(pos-1);
    if (p->next != NULL)
    {
        Lnode* q = p->next;
        p->next = q->next;
        delete q;
    }
}

int link::find_elem(int elem)
{
    int ord = 1;
    Lnode* p = L->next;
    while (p != NULL)
    {
        if (p->date == elem)
        {
            return ord;
        }
        ord += 1;
        p = p->next;
    }
    return 0;
}

void link::front_insert(Lnode* p, int date)
{
    Lnode* pnew = new Lnode;
    pnew->date = p->date;
    pnew->next = p->next;
    p->date = date;
    p->next = pnew;
}
void link::Lnode_inv()
{
    Lnode* p = L->next;
    if (p != NULL)
    {
        Lnode* q = p->next;
        while (q != NULL)
        {
            p->next = q->next;
            q->next = L->next;
            L->next = q;
            q = p->next;
        }
    }
}


void link::Lnode_inv1()
{
    Lnode* p = L->next;
    if (p != NULL)
    {
        Lnode* q = p->next;
        while (q != NULL)
        {
            back_insert(L, q->date);
            p->next = q->next;
            delete q;
            q = p->next;
        }
    }
}

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值