C/C++知识点之C++编写双向链表
小标 2018-08-10 来源 : 阅读 1073 评论 0

摘要:本文主要向大家介绍了C/C++知识点之C++编写双向链表,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之C++编写双向链表,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

创建双向链表类,该类有默认构造函数、类的拷贝函数、类的、实现链表添加数据、升序排序、查找链表中某个节点及删除链表中某个节点的操作

代码实现:

复制代码
#include<iostream>
#include<string.h>
using namespace std;

typedef int ElemData;

struct node{ //节点类
    ElemData data;
    node *next;
    node *prev;
};

class LinkList //双向链表类
{
    public:
        node *head;//指向头结点
        node *tail;//指向尾节点
        int len;//链表长度
    public:
        LinkList();//构造函数
        LinkList(const LinkList &l);//拷贝函数
        ~LinkList();//析构函数
        void addNode(ElemData data);//往尾部添加元素
        void upSort();//升序排序
        void findNode(int n);//查找某个节点
        void delNode(int n);//删除某个节点
        void showNode();//输出所有节点数据
};

LinkList::LinkList()
{
    head = NULL;
    tail = NULL;
    len = 0;
}

LinkList::LinkList(const LinkList &l)
{
    if(l.head!=NULL)
    {
        node *pHc = l.head;
        head = new node();//为节点申请空间
        head->data = pHc->data;
        len++;
        pHc = pHc->next;
        node *pH = head;
        while(pHc!=l.tail)
        {
            pH->next = new node();
            len++;
            pH->data = pHc->data;
            pHc = pHc->next;
        }
    }
    else
    {
        head=tail=NULL;
        len = 0;
    }
}
LinkList::~LinkList()
{
    node *bgn = head;
    while(head!=tail)
    {
        head = head->next;
        delete bgn;//释放内存
        bgn = head;
    }
    len = 0;
}

void LinkList::addNode(ElemData data)
{
    if(head==NULL)
    {
        head = new node();
        head->data = data;
        len++;
        tail = head;
    }
    else
    {
        tail->next = new node();
        tail->next->data = data;
        len++;
        tail->next->prev = tail;
        tail = tail -> next;
    }
}

void LinkList::showNode()
{
    node *p;
    p=head;
    if(p==NULL)
        cout<<"List id empty"<<endl;
    else
    {
        while(p!=tail->next)
        {
            cout<<p->data<<" ";
            p = p ->next;
        }
        cout<<endl;
    }
}

void LinkList::upSort()
{
    node *p,*q;
    ElemData temp;
    for(p=head;p!=tail->next;p=p->next)
    {
        for(q=p->next;q!=tail->next;q=q->next)
        {
            if(p->data>q->data)
            {
                temp = p->data;
                p->data = q->data;
                q->data = temp;
            }
        }
    }
}
void LinkList::findNode(int n)
{
    node *p;
    p = head;
    if(n>len)
        cout<<"超出链表长度";
    else
    {
        for(int i=1;i<n;i++)
        {
            p = p->next;
        }
        cout<<"该节点是:"<<p->data<<endl;
    }
}
void LinkList::delNode(int n)
{
    node *p,*q;
    p = head;
    q = head->next;
    if(n>len)
        cout<<"超出链表长度";
    else
    {
        for(int i=2;i<n;i++)
        {
            p = p->next;
            q = q->next;
        }
        p->next = q->next;
        q->next->prev = p;
        delete q;
    }
}

int main()
{
    int n;
    LinkList lin;
    cout<<"插入节点:"<<endl;
    lin.addNode(5);
    lin.addNode(8);
    lin.addNode(7);
    lin.addNode(4);
    lin.addNode(3);
    lin.addNode(4);
    lin.addNode(1);
    lin.addNode(0);
    lin.showNode();
    lin.upSort();
    cout<<"输出所有节点:"<<endl;
    lin.showNode();
    cout<<"输入要查找第几个节点:"<<endl;
    cin>>n;
    lin.findNode(n);
    cout<<"输入要删除第几个节点:"<<endl;
    cin>>n;
    lin.delNode(n);
    lin.showNode();
    return 0;
}    

本文由职坐标整理并发布,了解更多内容,请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程