单链表
代码不难,主要需要理清思路,节点类中的指针变量需要消化理解,通俗点讲就是,一个节点是由值和指针组成的,指针指向下一个节点,然后下一个节点中的指针指向下下个节点…
本文章介绍单链表,需要双向链表的自行下载
单向链表+双向链表代码《点击链接》关注免费下载
一、首先创建节点类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;
}
管理类中主要实现了增删改查的操作,代码注释很详细,有不明白的的私聊我