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

#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
    评论
好的,C++ 语言中的链表可以使用 `struct` 或 `class` 来定义,我这里使用 `class` 来实现。代码如下: ```c++ #include <iostream> using namespace std; class Student { public: int num; string name; Student *next; Student(int num, string name) { this->num = num; this->name = name; this->next = NULL; } }; class LinkedList { public: Student *head; LinkedList() { this->head = NULL; } void add(Student *node) { if (this->head == NULL) { this->head = node; } else { Student *p = this->head; while (p->next != NULL) { p = p->next; } p->next = node; } } void print() { Student *p = this->head; int i = 1; while (p != NULL) { cout << "第" << i << "个学生的学号和姓名:" << p->num << " " << p->name << endl; p = p->next; i++; } } }; int main() { LinkedList *list = new LinkedList(); list->add(new Student(1, "张三")); list->add(new Student(2, "李四")); list->add(new Student(3, "王五")); list->print(); return 0; } ``` 这个程序会输出以下结果: ``` 第1个学生的学号和姓名:1 张三 第2个学生的学号和姓名:2 李四 第3个学生的学号和姓名:3 王五 ``` 在这个程序中,我们使用了 `class` 来定义了两个类:`Student` 和 `LinkedList`。 `Student` 类表示链表中的一个结点, `LinkedList` 类表示整个链表。我们在 `main()` 函数中创建了一个 `LinkedList` 类的对象 `list`,然后使用 `list->add()` 方法向链表中添加了三个学生结点,最后使用 `list->print()` 方法输出链表中的所有结点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值