使用C++结合类跟结构体编写一个双向链表

这篇博客详细介绍了如何使用C++编写一个双向链表类,包括构造函数、拷贝构造函数、析构函数、添加元素、排序、输出、查找、删除和修改节点数据等操作。示例代码展示了链表的增删改查功能,并提供了主函数进行测试。
摘要由CSDN通过智能技术生成

用C++写一个双向链表

创写一个双向链表的类和一个结构体,类中包含构造函数、拷贝函数、析构函数、链表的添加数据函数、链表排序函数、输出链表元素函数、删除一结点函数、查找某个结点的函数和修改某个结点数据函数。

类和结构体的.h文件

#ifndef LINK_H
#define LINK_H

struct node
{
    int data;
    node* prve;
    node* next;
};

class Link
{
public:
    node* frist;
    node* last;
    int len;

public:
    Link();//构造函数
    Link(const Link &t);//拷贝构造函数
    ~Link();    //析构函数
    void add_link(int );//尾插
    void print_link();//输出结点数据
    void up_link();//升序排序
    void find_link(int );//查找第几个结点数据
    void dele_link(int);//删除第几个结点数据
    void change_link(int,int);//修改第几个结点的数据

};

#endif // __LINK_H__

link.cpp

#include <iostream>
#include "./link.h"

using namespace std;


/** \brief 构造函数
 */
Link:: Link()
{
    frist = NULL;
    last = NULL;
    len = 0;
}

/** \brief 拷贝构造函数
 * \param Linkl类创建的对象l
 */
Link::Link(const Link &l)
{
    if(l.frist != NULL)
    {
        node *pch = l.frist;
        frist = new node();
        frist->data = pch->data;
        len++;
        pch = pch->next;
        node *ph = frist;
        while(pch != NULL)
        {
            ph->next = new node();
            len++;
            ph->data = pch->data;
            pch = pch->next;

        }
    }
    else
    {
        frist = last = NULL;
        len = 0;
    }
}

/** \brief 析构函数
 */
Link::~Link()
{
    node *p = frist;
    while(frist != NULL)
    {
        frist = frist->next;
        delete p;
        p = frist;
    }
    len = 0;
}

/** \brief 尾插法添加元素
 * \param data 要添加的结点元素数据
 * \return
 */
void Link::add_link(int data)
{
    if(frist == NULL)
    {
        frist = new node();
        frist->data = data;
        len++;
        last = frist;
    }
    else
    {
        last->next = new node();
        last->next->data = data;
        len++;
        last->next->prve = last;
        last = last->next;
    }
}

/** \brief 输出每个结点的数据
 * \return
 */
void Link::print_link()
{
    node *p;
    p = frist;
    if(p == NULL)
        cout<<"Link is empty" <<endl;
    else
    {
        while(p != last->next)
        {
            cout<< p->data <<" ";
            p = p->next;
        }
        cout <<endl;
    }
}

/** \brief 将结点中的数据进行升序排序
 * \return
 */
void Link::up_link()
{
    node *p,*q;
    int flag;
    for(p = frist;p != last->next;p = p->next)
        for(q = p->next;q != last->next;q = q->next)
        {
            if(p->data > q->data)
            {
                flag = p->data;
                p->data = q->data;
                q->data = flag;
            }
        }
}

/** \brief 查找第几个结点的元素
 * \param n代表链表中第n个结点
 * \return
 */
void Link::find_link(int n)
{
    if(n > len)
        cout<< "超出链表的长度" <<endl;
    node *p;
    p = frist;
    int i;
    for(i = 1;i < n;i++)
    {
        p = p->next;
    }
    cout<< p->data <<endl;
}

/** \brief 删除某个结点
 * \param n 代表链表的第n个结点
 * \return
 */
void Link::dele_link(int n)
{
    int i;
    node *p,*q;
    p = frist;
    q = p->next;
    for(i = 1;i < n;i++)
    {
        p = p->next;
        q = p->next;
    }
    p->prve->next = q;
    q->prve = p->prve;
    delete p;
    len--;
}

/** \brief 修改某个结点的数据
 * \param n 代表要被修改的链表的第n个结点
 * \param data 修改的数据
 * \return
 */
void Link::change_link(int n,int data)
{
    node *p;
    p = frist;
    int i;
    for(i = 1;i < n;i++)
    {
        p = p->next;
    }
    p->data = data;
}

main函数

#include <iostream>
#include "./link.h"

#define end 0
using namespace std;



int main()
{
    Link h;
    int x;
    int n,m,k,j;
    cout<<"插入结点元素:"<<endl;
    while(1)
    {
        cin>>x;
        if(x == end)
            break;
         h.add_link(x);
    }
    h.up_link();
    cout<<"输出链表中的元素:"<<endl;
    h.print_link();
    cout<<"链表长度:"<<h.len<<endl;

    cout<<"输入要查找的结点:"<<endl;
    cin>>n;
    h.find_link(n);

    cout<<"输入要删除的结点:"<<endl;
     cin>>m;
    h.dele_link(m);
    h.print_link();
    cout<<"链表长度:"<<h.len<<endl;

    cout<<"输入要修改的结点:"<<endl;
    cin>>k;
    cin>>j;
    h.change_link(k,j);
    h.print_link();


    return 0;
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值