C++实现单链表

阅读先知

链表是一种动态数据结构,他的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。

链表中每一个元素成为“结点”,每一个结点都是由数据域和指针域组成的,每个结点中的指针域指向下一个结点。Head是“头指针”,表示链表的开始,用来指向第一个结点,而最后一个指针的指针域为NULL(空地址),表示链表的结束。

可以看出链表结构必须利用指针才能实现,即一个结点中必须包含一个指针变量,用来存放下一个结点的地址。

结点中只有一个next指针的链表称为单链表,这是最简单的链表结构。

具体实现

  1. 首先定义一个结构体,表示链表的节点

    typedef struct Node
    {
    ElemType data;
    struct Node *next;
    }LinkList;
  2. 建立单链表类

    class Mylist
    {
    private:
    LinkList* L;
    public:
    //初始化一个带头结点的单链表
    bool InitList()
    {
    L = new LinkList;
    if (L==NULL)
    {
    cout << "Not have enough memory!";
    return false;
    }
    L->next = NULL;
    return true;
    }
    bool CreateNode(int size)
    {
    int i = 0;
    ElemType e;
    LinkList* p =L;
    cout << ">>>>please input "<<size<<" nodes with space to split:";
    while(i<size)
    {
    LinkList* q = new LinkList;
    cin >> e;
    q->data = e;
    q->next = NULL;
    p->next = q;
    p = q;
    i++;
    }
    return true;
    }
    void DispList()
    {
    LinkList* p = L->next;
    while (p!=NULL)
    {
    cout << p->data<<' ';
    p = p->next;
    }
    cout << endl;
    }
    int ListLength()
    {
    int i = 0;
    LinkList* p = L->next;
    while (p!=NULL)
    {
    ++i;
    p = p->next;
    }
    return i;
    }
    bool ListEmpty()
    {
    return L->next == NULL;
    }
    bool GetElem(int site,ElemType &e)
    {
    int i =0;
    LinkList* p = L;
    while (i<site && p!=NULL)
    {
    i++;
    p = p->next;
    }
    if (p == NULL || site == 0)
    return false;
    else
    {
    e = p->data;
    return true;
    }
    }
    bool LocateElem(int &site,ElemType e)
    {
    int i = 1;
    LinkList* p = L->next;
    while (p!= NULL && p->data!=e)
    {
    i++;
    p = p->next;
    }
    if (p==NULL)
    return false;
    else
    site = i;
    return true;
    }
    //插入元素
    bool ListInsert(int site,ElemType e)
    {
    int i = 0;
    LinkList* p = L->next;
    while (i < site && p!=NULL)
    {
    i++;
    p = p->next;
    }
    if (p == NULL)
    return false;
    else
    {
    LinkList* q = new LinkList;
    q->data = e;
    q->next = NULL;
    p->next = q;
    return true;
    }
    }
    //删除元素
    bool ListDelete( int site, ElemType &e )
    {
    int i = 0;
    LinkList* p = L;
    while ( i<site-1 && p!=NULL )
    {
    i++;
    p = p->next;
    }
    if ( NULL == p )
    return false;
    else
    {
    LinkList* q = p->next;
    if ( NULL == q )
    return false;
    e = q->data;
    p->next = q->next;
    delete q;
    return true;
    }
    }
    // (带头一起)销毁链表
    void DestoryList()
    {
    LinkList *p, *q;
    p = L;
    while ( p!=NULL )
    {
    q = p->next;
    delete p;
    p = q;
    }
    }
    };

    主函数代码

    int main()
    {
    Mylist h;
    ElemType e;
    int temp=0;
    h.InitList();
    cout << ">>>>please input the length of linklist:";
    cin >> temp;
    h.CreateNode(temp);
    cout <<"show:";
    h.DispList();
    cout <<"the length of linklist is:"<<h.ListLength()<<endl;
    cout <<"is it empty?"<<h.ListEmpty()<<endl;
    cout << ">>>>which element do you want to find:";
    cin >> temp;
    h.GetElem(temp,e);
    cout <<"this element is "<<e<<endl;
    cout << ">>>>Which element index do you want to find:";
    cin >> temp;
    h.LocateElem(temp,temp);
    cout <<"this element index is "<<temp<<endl;
    return 0;
    }

    拓展应用

_题目描述:_判断链表是否带环,以及环的入口

  • 有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的任意一个节点,这样在链表尾部形成一个环。

主要思想:

  • 如果判断一个链表是否存在一个环?设定两个指针slow,fast,均从头指针开始,每次分别前进1步、2步。如果存在环,则两者相遇;如不存在环,fast遇到NULL退出。
  • 如果链表存在环,如何找到环的入口点?当fast与slow相遇时,slow肯定没有遍历完链表或者恰好遍历一遍。于是我们从链表头与相遇点分别设一个指针,每次各走一步,两个指针必定相遇,则相遇的第一个点为环入口点。

数学解析:

代码部分:

    bool findloopport(ElemType &e)
{
LinkList* fast = L;
LinkList* slow = L;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
if (slow == fast)
break;
}
if (fast == NULL || fast->next == NULL)
return false;
slow = L;
while (slow != fast)
{
slow = slow->next;
fast = fast->next;
}
e = slow->data;
return true;
}

温馨提示:代码可以根据个人习惯编写,本文还有待补缺的地方。。。。

singlelinklist的更多相关文章

  1. JAVA 链表操作:单链表和双链表

    主要讲述几点: 一.链表的简介 二.链表实现原理和必要性 三.单链表示例 四.双链表示例 一.链表的简介 链表是一种比较常用的数据结构,链表虽然保存比较复杂,但是在查询时候比较便捷,在多种计算机语言都 ...

  2. 剑指offer—第三章高质量代码(o(1)时间删除链表节点)

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue ...

  3. python数据结构链表之单向链表

    单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...

  4. python 单向链表实现

    单链表的操作 is_empty() 链表是否为空 length() 链表长度 travel() 遍历整个链表 add(item) 链表头部添加元素 append(item) 链表尾部添加元素 inse ...

  5. 初始数据结构(python语言)

    数据结构 概念:数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 算法复杂度 时间复杂度 时间复杂度是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法 ...

  6. Python线性表——单链表

    1. 线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列.线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱 ...

  7. 单链表的python实现

    首先说下线性表,线性表是一种最基本,最简单的数据结构,通俗点讲就是一维的存储数据的结构. 线性表分为顺序表和链接表: 顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,称为线性表的顺序存 ...

  8. python数据结构与算法第七天【链表】

    1.链表的定义 如图: 注意: (1)线性表包括顺序表和链表 (2)顺序表是将元素顺序地存放在一块连续的存储区里 (3)链表是将元素存放在通过链构造的存储快中 2. 单向链表的实现 #!/usr/bi ...

  9. 用python实现单向链表

    单向链表 单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域.这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值. 表元素域ele ...

随机推荐

  1. Blazor组件自做三 : 使用JS隔离封装ZXing扫码

    Blazor组件自做三 : 使用JS隔离封装ZXing扫码 本文基础步骤参考前两篇文章 Blazor组件自做一 : 使用JS隔离封装viewerjs库 Blazor组件自做二 : 使用JS隔离制作手写 ...

  2. 进程的概念及multiprocess模块的使用

    一.进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在 ...

  3. Vue踩坑1——驼峰命名

    使用自定义Vue组件的时候,其他个方面都正常,但是浏览器就是显示不出自定义标签里的内容 <!DOCTYPE html> <html lang="en"> & ...

  4. Spring 源码 (2)Spring IOC 容器 前戏准备工作

    Spring 最重要的方法refresh方法 根据上一篇文章 https://www.cnblogs.com/redwinter/p/16141285.html Spring Bean IOC 的创建 ...

  5. Dubbo 学习笔记

    分布式基础理论 1. 什么是分布式系统? 分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个系统 2. 应用架构演变 单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起 ...

  6. 使用 bitnami/postgresql-repmgr 镜像快速设置 PostgreSQL HA

    什么是 PostgreSQL HA? 此 PostgreSQL 集群解决方案包括 PostgreSQL 复制管理器(replication manager),这是一种用于管理 PostgreSQL 集 ...

  7. vue动态路由实现原理 addRoute

    vue新版router.addRoute基础用法 新版Vue Router中用router.addRoute来替代原有的router.addRoutes来动态添加路由.子路由 在添加子路由的时候 比如 ...

  8. 论文解读(SUBG-CON)《Sub-graph Contrast for Scalable Self-Supervised Graph Representation Learning》

    论文信息 论文标题:Sub-graph Contrast for Scalable Self-Supervised Graph Representation Learning论文作者:Yizhu Ji ...

  9. FreeRTOS --(16)资源管理之临界区

    转载自 https://blog.csdn.net/zhoutaopower/article/details/107387427 临界区的概念在任何的 SoC 都存在,比如,针对一个寄存器,基本操作为 ...

  10. 【ACM程序设计】并查集

    并查集 并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题.一些常见的用途有:求连通子图.求最小生成树的Kruskal算法和求最近公共祖先( ...