C++list链表代码实现

7 篇文章 0 订阅

单链表

代码不难,主要需要理清思路,节点类中的指针变量需要消化理解,通俗点讲就是,一个节点是由值和指针组成的,指针指向下一个节点,然后下一个节点中的指针指向下下个节点…

本文章介绍单链表,需要双向链表的自行下载
单向链表+双向链表代码《点击链接》关注免费下载

一、首先创建节点类Node
Node.h文件代码

#ifndef NODE_H
#define NODE_H


class Node
{
public:
    Node();
    Node(int value,Node* next);
    Node* getnext();
    void setnext(Node* next);
    void setvalue(int value);
    int getvalue();
private:
    int m_value;
    Node* m_next;
};

#endif // NODE_H

Node.cpp文件代码

#include "node.h"

Node::Node()
{

}
Node::Node(int value,Node* next){
    m_value=value;
    m_next=next;
}
Node* Node::getnext(){
    return m_next;
}
void Node::setnext(Node* next){
    m_next=next;
}
void Node::setvalue(int value){
    m_value=value;
}

int Node::getvalue(){
    return m_value;
}

节点类中主要是封装一下节点中的值和指针

二、创建list管理类Nodelist

Nodelist.h文件代码

#ifndef NODELIST_H
#define NODELIST_H
#include "node.h"

class Nodelist
{
public:
    Nodelist();
    Nodelist(int num);
    ~Nodelist();
    int getCount();//返回元素个数
    Nodelist reverse();//list的逆置
    void reverses();
    void reverseA();
    void alter(int num,int value);//修改
    void push_front(int value);//头部添加
    void push_back(int value);//末尾添加
    void push_back(Nodelist list);//末尾添加
    void push_among(int num,int value);//中间添加
    void pop_back();//删除最后一个元素    
    void pop_among(int num);//删除中间一个元素
    void pop_front();//删除第一个元素
    bool empty();//判断list是否为空
    void clear();//清空list
    int check(int num);//查.输入下标返回值
    void display();//遍历输出
private:
    Node* m_head;
    int m_count;
};

#endif // NODELIST_H

Nodelist.cpp文件代码

#include "nodelist.h"
#include <iostream>
using namespace std;
Nodelist::Nodelist()
{
    m_head=nullptr;
    m_count=0;

}
Nodelist::Nodelist(int num){
    m_head=nullptr;
    m_count=0;
    for(int i=0;i<num;i++){
        if(m_count==0){
            m_head=new Node(i+1,nullptr);
            m_count++;
        }else{
            Node * p=m_head;
            for(int i=1;i<m_count;i++){
                p=p->getnext();
            }
            p->setnext(new Node(i+1,nullptr));
            m_count++;
        }
    }
}
Nodelist::~Nodelist(){
    clear();
}
//头部添加
void Nodelist::push_front(int value){
    Node * p=m_head;
    m_head=new Node(value,p);
    m_count++;
}
//中间添加
void Nodelist::push_among(int num,int value){
    if(num==0){
        push_front(value);
    }else{
        Node * p=m_head;
        for(int i=0;i<num-1;i++){
            p=p->getnext();
        }
        Node * p1=p;
        p->setnext(new Node(value,p1->getnext()));
        m_count++;
    }
}
//末尾添加
void Nodelist::push_back(int value){
    if(m_count==0){
        m_head=new Node(value,nullptr);
        m_count++;
    }else{
        Node * p=m_head;
        for(int i=1;i<m_count;i++){
            p=p->getnext();
        }
        p->setnext(new Node(value,nullptr));
        m_count++;
    }
}
//末尾添加Nodelist
void Nodelist::push_back(Nodelist list){
    for(int i=1;i<list.getCount()+1;i++){
         push_back(list.check(i));
    }
}
//删除最后一个元素
void Nodelist::pop_back(){
    if(m_count>0){
        if(m_count==1){
            delete m_head;
            m_count--;
        }else{
            Node * p=m_head;
            for(int i=0;i<m_count-1;i++){
                p=p->getnext();
            }
            delete p;
            m_count--;
        }
    }
}
//删除中间一个元素
void Nodelist::pop_among(int num){
    if(num==1){
        pop_front();
    }else if(num==m_count){
        pop_back();
    }else{
        Node * p=m_head;
        Node * p1=m_head;
        for(int i=0;i<num;i++){
            p=p->getnext();
        }
        for(int i=0;i<num-1;i++){
            p1=p1->getnext();
        }
        p1->setnext(p->getnext());
        delete p;
        m_count--;
    }
}
//删除第一个元素
void Nodelist::pop_front(){
    if(m_count>0){
        if(m_count==1){
            delete m_head;
            m_count--;
        }else{
            Node * p=m_head->getnext();
            delete m_head;
            m_head=p;
            m_count--;
        }
    }
}
//清空list
void Nodelist::clear(){
    int num=m_count;
     for(int i=0;i<num;i++){
         pop_back();
     }
}
//判断list是否为空
bool Nodelist::empty(){
    bool bol;
    if(m_count==0){
        bol=true;
    }else{
        bol=false;
    }
    return bol;
}
//修改
void Nodelist::alter(int num,int value){
    if(m_count>0 && num<m_count){
        if(m_count==1){
            m_head->setvalue(value);
        }else{
            Node * p=m_head;
            for(int i=0;i<num;i++){
                p=p->getnext();
            }
            p->setvalue(value);
        }
    }
}
//list的逆置
Nodelist Nodelist::reverse(){
    Nodelist list1;
    int value;
    for(int i= m_count;i>0;i--){
        value=check(i);
        pop_back();
        list1.push_back(value);
    }
    return list1;
}
void Nodelist::reverses(){
    Nodelist list1;
    int value;
    for(int i= m_count;i>0;i--){
        value=check(i);
        pop_back();
        list1.push_back(value);
    }
    for(int i=1;i<list1.getCount()+1;i++){
        value=list1.check(i);
        push_back(value);
    }
    list1.clear();
}
void Nodelist::reverseA(){
    Node * p1=m_head;
    Node * p2=m_head->getnext();
    m_head->setnext(nullptr);
    for(int i=0;i<m_count-1;i++){
        p1=p2;
        p2=p2->getnext();
        p1->setnext(m_head);
        m_head=p1;
    }
}

//查.输入下标返回值
int Nodelist::check(int num){
    Node * p=m_head;
    for(int i=0;i<num-1;i++){
        p=p->getnext();
    }
    return p->getvalue();
}
//遍历输出
void Nodelist::display(){
    Node * p=m_head;
    for(int i=0;i<m_count;i++){
        cout<<p->getvalue()<<endl;
        p=p->getnext();
    }
}
//返回元素个数
int Nodelist::getCount(){
    return m_count;
}

管理类中主要实现了增删改查的操作,代码注释很详细,有不明白的的私聊我

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值