【数据结构】线性表的链式存储结构简单实现及应用

2023-10-30

        链表是指用一组任意的存储单元来依次存放线性表的结点,这组存储单元即可以是连续的,也可以是不连续的,甚至是零散分布在内存中的任意位置上的。因此,链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息,这个信息称为指针(pointer)或链(link)。这两部分组成了链表中的结点结构:

  1)存储数据元素自身信息的部分,称为数据域;

  2)存储与前驱或后继结点的逻辑关系,称为指针域;

                                                            

其中:data域是数据域,用来存放结点的值。next是指针域(亦称链域),用来存放结点的直接后继的地址(或位置)。链表正是通过每个结点的链域将线性表的n个结点按其逻辑次序链接在一起的。由于上述链表的每一个结只有一个链域,故将这种链表称为单链表Single Linked)。

   显然,单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。同时,由于最后一个结点无后继,故结点的指针域为空,即NULL(图示中常用^表示)。

#include<iostream>//单链表基本操作插入 删除 增加 获得长度 打印
using namespace std;
typedef int ElemType;
typedef struct lnode
{
    int data;
    lnode *next;//lnode 类的啊啊啊
}lnode;
class LinkList
{
private:
    lnode *head;
    int length = 0 ;
public:
    void CreatList1(int n);//头插法
    void CreatList2(int n);//尾插法
    void ListInsert(int i,int e);//插入i个位置某个数e
    int ListDelete(int i);//删掉第i个数
    int GetElem(int i);//获得第i个数
    int LocateElem(int e);//获得数e的地址
    int Listlength();//获得长度
    void printList();//打印链表;
    void reverse(lnode *& head);
};
void LinkList::CreatList1(int n)
{
    lnode *p;
    cout<<"输入"<<n<<"个数据元素值"<<endl;
    for(int i=0;i<n;i++)
    {
        p=new lnode;
        cin>>p->data;
        p->next=head->next;
        head->next=p;
        length++;
    }
}
void LinkList::CreatList2(int n)
{
    lnode *p,*s=head;
    cout<<"输入"<<n<<"个数据元素"<<endl;
    for(int i=0;i<n;i++)
    {
        p=new lnode;
        cin>>p->data;
        p->next=NULL;
        s->next=p;
        s=p;
        length++;
    }
}

int LinkList::LocateElem(int e)
{
    lnode *p=head->next;
    int j=1;
    while(p&&p->data!=e)
    {
        p=p->next;
        j++;
    }
    if(p==NULL)
        return 0;
    else
        return j;
}
int LinkList::GetElem(int i)
{
    lnode *p=head->next;
    int j=1;
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i)
        return -1;
    else
        return p->data;
}
void LinkList::ListInsert(int i,int e)
 {
     int j=0;
     lnode*p=head;
     while (p&&j<i-1)
     {
         p=p->next;
         j++;
     }
     if(!p||j>i-1)
     {
         cout<<"failure"<<endl;
         return ;
     }
     else
     {
         lnode*s=new lnode;
         s->data=e;
         s->next=p->next;
         p->next=s;
         length++;
     }
 }
int LinkList::ListDelete(int i)
{
    int j=0;
    lnode*p=head;
    while (p&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i-1)
    {
        cout<<"fail to delete"<<endl;
        return -1;
    }
    else
    {
        lnode*s=p->next;
        p->next=s->next;
        j=s->data;
        delete s;
        return j;
    }
}
int LinkList::Listlength()
{
    return length;
}
void LinkList::printList()
{
    int i = length;
    lnode* p = head;
    while(i --)
    {
        p = p -> next;
        cout<<p -> data <<" ";
    }
}
void LinkList::reverse(lnode *& head)
{
    lnode* p = head -> next;
    if(!p || ! p -> next)
    {
        cout<<" wrong"<<endl;
        return;
    }
    lnode * qr = p -> next, * q;
    p ->next = NULL;
}
int main()
{
    LinkList LinkLista;
    LinkLista.CreatList1(5);
    LinkLista.printList();
    cout << "length:"<<LinkLista.Listlength()<<endl;
    LinkLista.ListInsert(2,5);
    LinkLista.printList();

    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构】线性表的链式存储结构简单实现及应用 的相关文章

随机推荐

  • 图的遍历(DFS & BFS)详解与完整代码+走迷宫

    一 深度优先遍历 DFS 基本思想 从初始访问结点出发 先访问第一个邻接结点 然后再以该邻接结点作为初始结点 访问它的第一个邻接结点 优先向纵向挖掘深入 而不是对一个结点的所有邻接结点进行横向访问 递归过程 深度优先遍历从某个顶点出发 首先
  • 关于C语言中源码反码补码的介绍

    最近在入门课里学习了原码反码补码 有些地方理解起来还是比较困难的 所以用一篇文章来梳理一下 首先我们要考虑这三个码的作用 我们都知道 计算机在储存信息时是使用二进制的 通过电信号的有无来表示0和1 而在C语言中数字类型都是默认有符号位的 在
  • 7-17 实数四舍五入后的相加运算

    本题目实现实数保留两位小数的四舍五入存储后 再相加 输入格式 输入两个双精度实数A B 输出格式 第一行输出A B的真实值 第二行输出A B进行四舍五入后再相加后的值 输入样例 12 345 4 896 输出样例 17 241000 17
  • 746. 使用最小花费爬楼梯

    class Solution public int minCostClimbingStairs vector
  • 将n个数按从大到小输出(C语言)

    用数组存储需要排序的数 用for循环输入需要排序的数 用冒泡排序法对n个数进行排序 最后用for循环输出排好的数 输入需要排序的数 for i 0 i lt n i scanf d a i 冒泡排序法进行排序 for int j 0 j l
  • 基于改进的混沌引力常数的引力搜索算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 本文将十张混沌图嵌入到最近提出的基于人口的
  • 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(沈阳)

    有时候 很简单的模板题 可能有人没有做出来 特指 I 到时候一定要把所有的题目全部看一遍 文章目录 B 题解 E F 题解 H I 题解 代码 J B 输入样例 3 2 1 2 1 2 3 1 输出样例 1 说明 In the first
  • qt问题之no known conversion from ... to “const QObject *“ ...

    函数体 connect socket SIGNAL readyRead this SLOT hasPendingMessage 解决办法 connect socket SIGNAL readyRead const QObject this
  • SAT&SMT

    前言 本文性质 个人学习笔记 SAT SATISFIABILITY 布尔可满足性问题 SMT Satisfiability Modulo Theories 可满足性模理论 根据哥德尔不完备定理 停机问题 莱斯定理 我们可以知道在有限时间内是
  • 基于Python的手机数据收集软件-爬虫可视化大屏Python爬虫安装数据分析与可视化计算机毕业设计

    更多项目资源 最下方联系我们 目录 一 项目技术介绍 二 项目配套文档 部分内容 资料获取 一 项目技术介绍 该项目含有源码 文档 PPT 配套开发软件 软件安装教程 项目发布教程 包运行成功以及课程答疑与微信售后交流群 送查重系统不限次数
  • Identity and Access Management - python decorators (代码)

    from functools import wraps def add greeting f wraps f def wrapper args kwargs print Hello return f args kwargs return w
  • nginx源码分析--状态机执行

    11个阶段处理HTTP请求 void ngx http core run phases ngx http request t r ngx int t rc ngx http phase handler t ph ngx http core
  • Markdown格式文档图片设置居中

    1 使用div设置对齐方式 div align center img src 图片路径 div 此处的center可以更换 left 左对齐 right 右对齐 center 居中 下图示例 div align center img src
  • 《算法》第二章——快排非递归实现

    思路 其实就是用栈保存每一个待排序子串的首尾元素下标 下一次while循环时取出这个范围 对这段子序列进行partition操作 代码 include
  • 如何保证代码质量

    代码质量的评估维度很多 我自己的理解有这几个层次 能用 gt 能读 gt 能改 gt 能适应业务的变更 高质量的代码不是一蹰而就的的 是从特别小的细节例如变量命名规则到高大上的架构设计 一点点积累而成的 关于架构设计的部分 正在阅读 重构
  • 13、不同存储引擎的数据表在文件系统里是如何表示的?

    MySQL 支持 InnoDB MyISAM Memory Merge Archive CSV BLACKHOLE 几种存储引擎 不同存储引擎的数据表在文件系统中的表示也各不相同 MySQL 中的每一个数据表在磁盘上至少被表示为一个文件 即
  • 融云出海:社交泛娱乐出海,「从 0 到 1」最全攻略

    9 月 21 日 融云直播课社交泛娱乐出海最短变现路径如何快速实现一款 1V1 视频社交应用 欢迎点击上方小程序报名 本期我们翻到 地图 的实践篇 从赛道 品类选择 目标地区适配 用户增长 变现模式 本地化运营 跨国团队管理等方面完整描绘
  • 用matlab使用灰狼算法规划15个城市的最短路径

    在Matlab中使用灰狼算法规划15个城市的最短路径需要以下步骤 建立矩阵 首先 您需要建立一个矩阵来存储15个城市之间的距离 定义灰狼算法参数 然后 您需要定义灰狼算法的各种参数 例如种群数量 迭代次数 学习因子等 运行灰狼算法 接下来
  • "当B发生时,是A发生的概率降低了,可以由此推出,当B不发生时A发生的可能性增大了"的直观解释

    一 当B发生时 是A发生的概率降低了 可以由此推出 当B不发生时A发生的可能性增大了 数学上的推导是容易的 即 二 接下来找一种直观上的解释 设有一个矩形的面积为1 设其为事件 发生的概率 A发生的概率即为A的面积 A B同时发生的概率即为
  • 【数据结构】线性表的链式存储结构简单实现及应用

    链表是指用一组任意的存储单元来依次存放线性表的结点 这组存储单元即可以是连续的 也可以是不连续的 甚至是零散分布在内存中的任意位置上的 因此 链表中结点的逻辑次序和物理次序不一定相同 为了能正确表示结点间的逻辑关系 在存储每个结点值的同时