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

链表由一个个的节点串联而成,同一由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. margin属性

    可以设置position:absolute/relative/fixed,通过调节top/bottom/left/right实现元素的定位,这样很好,但是有时候想通过margin来实现. 下面是mar ...

  2. CSS中可以和不可以继承的属性

    一.无继承性的属性 1.display:规定元素应该生成的框的类型 2.文本属性: vertical-align:垂直文本对齐 text-decoration:规定添加到文本的装饰 text-shad ...

  3. Java类WebServer及中间件拿webshell方法总结

    0.序 原文名称:Tomcat.Weblogic.JBoss.GlassFish.Resin.Websphere弱口令及拿webshell方法总结 原文from:http://www.hack80.c ...

  4. Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(一)

    1,其实早就想把这些东西给封装封装的,一直没有时间,今天刚好项目进入到测试阶段了,Bug同事在哪儿测试的飞起,但发现提bug的尽然是我(得意脸),然后上午把ios的包测试了一下,顺便把服务器给测挂了( ...

  5. Windows编程入门程序详解

    引用:http://blog.csdn.net/jarvischu/article/details/8115390 1.     程序 /******************************* ...

  6. Python练习,网络小爬虫(初级)

    最近还在看Python版的rcnn代码,附带练习Python编程写一个小的网络爬虫程序. 抓取网页的过程其实和读者平时使用IE浏览器浏览网页的道理是一样的.比如说你在浏览器的地址栏中输入    www ...

  7. World Wind .NET源码编译问题处理

    World  Wind  .NET源码编译问题处理 下载了World_Wind_1.4.0_Source源码(http://worldwindcentral.com/wiki/NASA_World_W ...

  8. ZwQuerySystemInformation 安全使用心得 Delphi 版

    作为 DELPHI 版本,需要引用 jwaNative, JwaWinType ,他们是 JEDI API 的一部分.JEDI 官网有下载. 先给出 2 个辅助函数 和 一些结构体. type     ...

  9. Oracle 正则表达式使用示例

    正则表达式的基本例子 在使用这个新功能之前,您需要了解一些元字符的含义.句号 (.) 匹配一个正规表达式中的任意字符(除了换行符).例如,正规表达式 a.b 匹配的字符串中首先包含字母 a,接着是其它 ...

  10. Apache JMeter安装

    Apache JMeter安装说明 1.       安装环境要求: Java版本 JMeter要求充分满足JVM1.3或更高. 操作系统 JMeter可以在当前任何一个已经部署了Java的操作系统上 ...