注:我是一个编程菜鸟,哪个大神看出来缺陷提点一下,感激不尽。

链表由一个个的节点串联而成,同一由first头指针管理,属于线性表中相比于数组,添加删除方便,但访问又有点慢的数据结构。

第一步:节点 Node的类。

class Node
{
    friend class List;//把List声明为友类,好在List类中容易访问Node的私有成员。
private:
    char Data;
    Node* next;
} ;//节点有两个数据成员,数据域的字符类型的 Data,以及指向下一个节点的指针域 next。

第二步: 链表List的类。

class List
{
    Node* first;//第一个节点的指针
    Node* end;//最后一个节点的指针。。。这一个数据成员可有可无,我用来记录最后一个节点的指针,添加新元素将会很快。
public:
    //构造函数
    List()
    {
        first=nullptr;
        end=nullptr;
    }
    /*添加元素*/
    Node* push_back(char p_back)
    {
        Node* a=new Node;
        a->Data=p_back;
        a->next=nullptr;
        if(a!=nullptr)
        {
          if (!first) //添加时是第一个节点的情况
          {
              first=a;
              end=a;
           }
            end->next=a;//已添加的最后一个节点的next指针赋值新添加的节点地址
            end=a;//end赋新的节点的地址。
         
            return end;
        }
        else
        {
            cout<<"节点分配空间失败"<<endl;
            return nullptr;
        }
        }
    /*显示链表中的各个元素*/
    void print()
    {
        Node* h=first;
        if (!h)
        {
            cout<<"空链表"<<endl;
        }
        else
        {
            while (h)
            {
               cout<<h->Data<<" ";
                h=h->next;
            }
        }
    }
    /*链表元素计数*/
    long count()
    {
        long acount=0;
        Node* start=first;
        while (start) {
            acount++;
            start=start->next;
        }
        return acount;
    }
    /*链表逆序*/
    void reverse()
    {
      //尾指针指向first
        end=first;
     //第一个节点指针域设为Null ,为逆序链表的尾节点,在这之前需要找到下一个节点
        Node* behind=first;//这个指针要做为下一个节点的next域。
        Node* pre=first->next;//当前第一个节点的的next域,靠它寻找第二个节点
        first->next=nullptr;//第一个节点变为尾节点
        first=pre;//first指向第二个节点
        while (first->next!=nullptr)
         {
            pre=first->next;//用于对first赋值
            first->next=behind;
            behind=first;
            first=pre;//first指向第二个节点
         }
        //还得执行最后一步
        first->next=behind;
    }
};

验证:

#include <iostream>
#include "List.h"
using namespace std;
int main(int argc, const char * argv[])
{
    
    List  a;
    a.push_back('h');
    a.push_back('e');
    a.push_back('l');
    a.print();
    cout<<endl;
    cout<<"该链表有:"<<a.count()<<"个元素。"<<endl;
    cout<<endl;
    cout<<"链表逆序之后输出:"<<endl;
    a.reverse();
    a.print();
    cout<<endl;
    cout<<"该链表有:"<<a.count()<<"个元素。"<<endl;
    return 0;
}
结果:

h e l
该链表有:3个元素。

链表逆序之后输出:
l e h
该链表有:3个元素。
Program ended with exit code: 0

注:我没有写析构函数,这会造成该程序运行时它的内存空间泄露,不过程序结束后,内存会被全部回收的。所有便于演示就没有写析构,不过大家千万不要学我呀。

c++实现简单的链表的更多相关文章

  1. C链表之创建简单静态链表

    C代码: #include<stdio.h> #include<stdlib.h> #include<malloc.h> //创建简单静态链表 typedef st ...

  2. 数据结构|-用C#实现一个简单的链表

    我们知道C#中是没有链表的,我们可以自己实现一个 整个单链表能实现的功能有: 功能 方法 返回值 备注 获取链表长度 GetLength() int 返回值是链表长度 清空链表 Clear() voi ...

  3. c++ 简单静态链表

    所有结点(结构体变量)都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为静态链表.对各结点既可以通过上一个结点的next指针去访问,也可以直接通过结构体变量名s1, s2, s3去访问 ...

  4. c语言的一个简单的链表

    此程序为作业题: 但不忍丢弃成果: 所以记一下: 哦,对了,有一个易错点:在链表里,字符要用字符数组,不能用单个字符. #include<stdio.h>#include<stdio ...

  5. linux简单内核链表排序

    #include <stdio.h> #include <stdlib.h> #define container_of(ptr, type, mem)(type *)((uns ...

  6. 利用java实现一个简单的链表结构

    *博客搬家:初版发布于 2014/07/04 定义: 所谓链表就是指在某节点存储数据的过程中还要有一个属性用来指向下一个链表节点,这样的数据存储方式叫做链表 链表优缺点: 优点:易于存储和删除 缺点: ...

  7. c 最简单的链表

    #include <stdio.h> struct node { int data; struct node *next; //指向本身的指针 }; // main() { struct ...

  8. 再次复习数据结构:c语言链表的简单操作

    最近呢,又要面临多次的数据结构与算法方面的试题了,而我呢,大概也重新温习c语言的基本要点快一个月了,主要是针对指针这货的角度在研究c语言,感觉又学到了不少. 现在c指针感觉知道点了,也就匆忙开展数据结 ...

  9. 用最简单的方式学Python单链表

    Python 实现单链表 在本博客中,我们介绍单链表这种数据结构,链表结构为基于数组的序列提供了另一种选择(例如Python列表). 基于数组的序列和链表都能够对其中的元素保持一定得顺序,但采用的方式 ...

随机推荐

  1. eclipse下导入jdk源码

    一直想好好看看jdk的源码,虽然可以直接解压jdk下的src看,但是终究不方便!后来发现可以导入到eclipse中,就在网上找了一些方法,下面就和大家分共享: step1:打开eclipse选择Win ...

  2. Docker入门简介

    Docker的概念 什么是Docker? Docker是一个开源平台,包含:容器引擎和Docker Hub注册服务器 Docker容器引擎:可以将开发者打包他们的应用和依赖包到一个可一直的容器中,然后 ...

  3. socket编程进阶

    1.   动态导入模块 第一种方法(python解释器自己内部用的): 上图是我程序的目录结构 下面代码是动态导入模块3.py的源码: #AUTHOR:FAN lib_dir = __import__ ...

  4. python 3.5 关于sys问题总结

    想把自己写的模组直接调用的时候,使用这个sys.path.append(): 但是总是报错(图1): 解决方案,去掉前面的from public; 解决思路: 1.sys.path.append(&q ...

  5. mysql的三种驱动类型

    http://862123204-qq-com.iteye.com/blog/1566581 1. Class.forName("com.mysql.jdbc.Driver");/ ...

  6. 导入csv文件到mysql

    原文 给自己做备份的,高手们请忽略. 数据太大,用数据库客户端软件直接导入非常卡,还是直接执行SQL吧. 1.指定文件路径. 2.字段之间以逗号分隔,数据行之间以\r\n分隔(我这里文件是以\n分隔的 ...

  7. MATLAB入门教程

    MATLAB入门教程   1.MATLAB的基本知识 1-1.基本运算与函数    在MATLAB下进行基本数学运算,只需将运算式直接打入提示号(>>)之後,并按入Enter键即可.例如: ...

  8. DOM的概念(1)

    什么是DOM? 通过 JavaScript,您可以重构整个HTML文档.您可以添加.移除.改变或重排页面上的项目.要改变页面的某个东西,JavaScript就需要对HTML文档中所有元素进行访问的入口 ...

  9. js实现文件上传

    js function UpladFile() { var fileObj = document.getElementById("filetes").files[0]; // 获取 ...

  10. window.onload和$(document).ready()的区别

    window.onload和$(document).ready()的区别,如下表所示   window.onload $(document).ready() 执行时间 在页面所有内容(图片.文件)加载 ...