数据结构:单链表头插法、尾插法、按值查找、按位查找、按位插入、删除、表长函数实现

2023-05-16

这里写目录标题

  • 数据结构定义
  • 初始化头结点
  • 判断链表是否为空
  • 带头结点的按位序插入
  • 头插法
  • 尾插法
  • 按值查找,返回节点
  • 按位查找,返回节点
  • 将新节点插入到第i个位置
  • 删除第i个节点
  • 遍历输出
  • 求链表长度
  • 主函数测试各个功能
  • 完整代码

数据结构定义

typedef struct Lnode{
    elemtype data;
    struct Lnode* next;
}Lnode,*Linklist;

初始化头结点

bool initlinklist(Linklist &l)
{
    l=(Lnode*)malloc(sizeof(Lnode));
    l->next=NULL;
    return true;
}

判断链表是否为空

bool listempty(Linklist &l)
{
    if(l->next==NULL)
        return true;
    else
        return false;
}

带头结点的按位序插入

bool listinsert(Linklist &l,elemtype e,int i)
{
    if(i<1)
    {
        return false;
    }
    Lnode*p=l;///指向当前扫描节点
    int j=0;///指向第几个

    while(p!=NULL && j<i-1) ///找到第i-1个节点
    {
        p=p->next;
        j++;
    }

    if(p==NULL) return false;/*当循环因为p==null跳出,说明链表已经遍历结束了,但是还没有找到第i-1个节点。*/
    /*j=n-1跳出*/

    Lnode *s=(Lnode*)malloc(sizeof(Lnode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;

}

头插法

Linklist list_headinsert(Linklist &l)
{
    elemtype x;
    cin>>x;
    while(x!=0)
    {
            Lnode* s=(Lnode*)malloc(sizeof(Lnode));
            s->data=x;
            s->next=l->next;
            l->next=s;
            cin>>x;
    }
    return l;
}

尾插法

Linklist list_tailinsert(Linklist &l)
{
    elemtype x;
    cin>>x;
    Linklist p=l;///指向最后一个节点
    while(x!=0)
    {
        Lnode *s =(Lnode*)malloc(sizeof(Lnode));
        s->data=x;
        p->next=s;
        p=s;
        cin>>x;
    }
    p->next=NULL;///表尾设置为NULL

    return l;
}

按值查找,返回节点

Lnode *locateelem(Linklist l,elemtype e)
{
    Linklist p=l->next;
    while(p!=NULL&&p->data!=e)
    {
        p=p->next;
    }
    return p;
}

按位查找,返回节点

Lnode *getelem(Linklist l,int i)
{
    if(i==0) return l;
    int j=1;///计数
    Linklist p=l->next;

    if(i<1) return NULL;

    while(j<i&&p!=NULL)
    {
        p=p->next;
        j++;
    }
    return p;
}

将新节点插入到第i个位置

借助前面的按位查找函数

Linklist insertlist(Linklist &l,int i,elemtype e)
{
    Lnode *s=(Lnode*)malloc(sizeof(Lnode));
    s->data=e;
    s->next=NULL;
    Linklist p=getelem(l,i-1);
    s->next=p->next;
    p->next=s;
}

删除第i个节点

Linklist deletenode(Linklist &l,int i)
{
    Linklist p=getelem(l,i-1);///删除节点的前驱节点
    Linklist q=p->next;///q指向删除节点
    p->next=q->next;
    free(q);

}

遍历输出

bool output(Linklist l)
{
    Linklist p=l->next;
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
    return true;
}

求链表长度

int listlen(Linklist l)
{
    Linklist p=l->next;
    int sum=0;
    while(p!=NULL)
    {
        p=p->next;
        sum++;
    }
    return sum;
}

主函数测试各个功能

int main()
{
    Linklist l;
    Linklist l2;
    initlinklist(l);///初始化表头
    initlinklist(l2);///初始化表头
    cout<<"*****表是否为空******"<<endl;
    cout<<listempty(l)<<endl;
    cout<<"*****头插法输入1 2 3 4 5 6 7 8 9 0******"<<endl;
    l=list_headinsert(l);///头插法,输入0结束
    output(l);
    cout<<"*****在第1个位置插入55******"<<endl;
    listinsert(l,55,1);
    output(l);
    cout<<"*****尾插法输入1 2 3 4 5 6 7 8 9 0******"<<endl;
    l2=list_tailinsert(l2);///尾插法,输入0结束
    output(l2);

    cout<<"*****求l的表长******"<<endl;
    cout<<listlen(l)<<endl;/*求表长*/

    cout<<"*****按值查找5,输出查找结果******"<<endl;
    Lnode *p=locateelem(l,5);
    cout<<p->data<<endl;

    cout<<"*****将10插到第四个位置******"<<endl;
    insertlist(l,4,10);
    output(l);

    cout<<"*****删除第五个节点******"<<endl;
    deletenode(l,5);
    output(l);
    return 0;
}

测试结果:
在这里插入图片描述

完整代码

#include<bits/stdc++.h>
#include<iostream>
#define elemtype int
using namespace std;
typedef struct Lnode{
    elemtype data;
    struct Lnode* next;
}Lnode,*Linklist;

/*初始化头结点*/
bool initlinklist(Linklist &l)
{
    l=(Lnode*)malloc(sizeof(Lnode));
    l->next=NULL;
    return true;
}

/*判断链表是否为空*/
bool listempty(Linklist &l)
{
    if(l->next==NULL)
        return true;
    else
        return false;
}
/*带头结点按位序插入*/
bool listinsert(Linklist &l,elemtype e,int i)
{
    if(i<1)
    {
        return false;
    }
    Lnode*p=l;///指向当前扫描节点
    int j=0;///指向第几个

    while(p!=NULL && j<i-1) ///找到第i-1个节点
    {
        p=p->next;
        j++;
    }

    if(p==NULL) return false;/*当循环因为p==null跳出,说明链表已经遍历结束了,但是还没有找到第i-1个节点。*/
    /*j=n-1跳出*/

    Lnode *s=(Lnode*)malloc(sizeof(Lnode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return true;

}
/*头插法*/
Linklist list_headinsert(Linklist &l)
{
    elemtype x;
    cin>>x;
    while(x!=0)
    {
            Lnode* s=(Lnode*)malloc(sizeof(Lnode));
            s->data=x;
            s->next=l->next;
            l->next=s;
            cin>>x;
    }
    return l;
}
/*尾插法*/
Linklist list_tailinsert(Linklist &l)
{
    elemtype x;
    cin>>x;
    Linklist p=l;///指向最后一个节点
    while(x!=0)
    {
        Lnode *s =(Lnode*)malloc(sizeof(Lnode));
        s->data=x;
        p->next=s;
        p=s;
        cin>>x;
    }
    p->next=NULL;///表尾设置为NULL

    return l;
}
/*按值查找*/
Lnode *locateelem(Linklist l,elemtype e)
{
    Linklist p=l->next;
    while(p!=NULL&&p->data!=e)
    {
        p=p->next;
    }
    return p;
}
/*按位查找*/
Lnode *getelem(Linklist l,int i)
{
    if(i==0) return l;
    int j=1;///计数
    Linklist p=l->next;

    if(i<1) return NULL;

    while(j<i&&p!=NULL)
    {
        p=p->next;
        j++;
    }
    return p;
}
/*将新节点插入到第i个位置*/
Linklist insertlist(Linklist &l,int i,elemtype e)
{
    Lnode *s=(Lnode*)malloc(sizeof(Lnode));
    s->data=e;
    s->next=NULL;
    Linklist p=getelem(l,i-1);
    s->next=p->next;
    p->next=s;
}
/*删除第i个节点*/
Linklist deletenode(Linklist &l,int i)
{
    Linklist p=getelem(l,i-1);///删除节点的前驱节点
    Linklist q=p->next;///q指向删除节点
    p->next=q->next;
    free(q);

}
/*遍历输出*/
bool output(Linklist l)
{
    Linklist p=l->next;
    while(p!=NULL)
    {
        cout<<p->data<<" ";
        p=p->next;
    }
    cout<<endl;
    return true;
}
/*求链表的长度*/
int listlen(Linklist l)
{
    Linklist p=l->next;
    int sum=0;
    while(p!=NULL)
    {
        p=p->next;
        sum++;
    }
    return sum;
}
int main()
{
    Linklist l;
    Linklist l2;
    initlinklist(l);///初始化表头
    initlinklist(l2);///初始化表头
    cout<<"*****表是否为空******"<<endl;
    cout<<listempty(l)<<endl;
    cout<<"*****头插法输入1 2 3 4 5 6 7 8 9 0******"<<endl;
    l=list_headinsert(l);///头插法,输入0结束
    output(l);
    cout<<"*****在第1个位置插入55******"<<endl;
    listinsert(l,55,1);
    output(l);
    cout<<"*****尾插法输入1 2 3 4 5 6 7 8 9 0******"<<endl;
    l2=list_tailinsert(l2);///尾插法,输入0结束
    output(l2);

    cout<<"*****求l的表长******"<<endl;
    cout<<listlen(l)<<endl;/*求表长*/

    cout<<"*****按值查找5,输出查找结果******"<<endl;
    Lnode *p=locateelem(l,5);
    cout<<p->data<<endl;

    cout<<"*****将10插到第四个位置******"<<endl;
    insertlist(l,4,10);
    output(l);

    cout<<"*****删除第五个节点******"<<endl;
    deletenode(l,5);
    output(l);
    return 0;
}

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

数据结构:单链表头插法、尾插法、按值查找、按位查找、按位插入、删除、表长函数实现 的相关文章

  • Virtualbox安装Debian 安装VBoxGuestAdditions增强工具

    1 按照以下两个网站安装Debian https www myxzy com post 470 html https www linuxidc com Linux 2017 11 148909p2 htm 2 按照以下网站修改用户权限 xf
  • 炉石传说酒馆战棋(python版)

    详细解释内容请见代码注释XD span class token keyword import span numpy span class token keyword as span np span class token comment 随
  • 谁说NTFS不支持UEFI启动的?启动U盘放不了超过4G的文件怎么办?Server2016 Win10 U盘UEFI启动制作方法

    大家都知道 xff0c 我们平时做启动盘 xff0c 用得最多的就是UltraISO 软碟通 这个工具了 用它我们可以很简单快速的把一个空白的普通U盘制作成一个PE启动U盘或系统U盘 xff0c 然后用它来安装系统非常的方便 xff0c 受
  • Linux下搭建iSCSI共享存储的方法 Linux-IO Target 方式CentOS7-1810下实现

    iSCSI xff08 internet SCSI xff09 技术由IBM公司研究开发 xff0c 是一个供硬件设备使用的 可以在IP协议的上层运行的SCSI指令集 xff0c 这种指令集合可以实现在IP网络上运行SCSI协议 xff0c
  • Ubuntu18.04 操作分屏显示快捷键

    了解快捷键能够提升您的生产力 这里有一些实用的 Ubuntu 快捷键助您像专业人士一样使用 Ubuntu 您可以用键盘和鼠标组合来使用操作系统 注意 xff1a 本文中提到的键盘快捷键适用于 Ubuntu 18 04 GNOME 版 通常
  • MySQL中使用LIMIT进行分页的方法

    一 分页需求 xff1a 客户端通过传递start 页码 xff0c pageSize 每页显示的条数 两个参数去分页查询数据库表中的数据 xff0c 那我们知道MySql数据库提供了分页的函数limit m n xff0c 但是该函数的用
  • kolla-ansible快速入门

    kolla ansible快速入门 kolla ansible是一个结构相对简单的项目 xff0c 它通过一个shell脚本 xff0c 根据用户的参数 xff0c 选择不同的playbook和不同的参数调用ansible playbook
  • noVNC连接多台远程主机

    noVNC是一个HTML5 VNC客户端 xff0c 采用HTML5 websockets Canvas和JavaScript实现 xff0c noVNC被普遍应用于各大云计算 虚拟机控制面板中 xff0c 比如OpenStack Dash
  • 如何进入ThinkServer RQ940服务器的UEFI HII SAS RAID阵列配置界面

    操作步骤 内容导航 一 进入SAS RAID阵列配置界面 二 硬盘选择操作 三 确认操作 一 进入SAS RAID阵列配置界面 启动服务器 xff0c 在出现ThinkServer logo的时候按F2或者Delete键进入BIOS配置界面
  • 联想服务器在UEFI HII界面中配置阵列的基本操作

    重要提示 xff1a 配置阵列时请谨慎操作 xff0c 并仔细阅读各种提示 xff0c 以防误操作导致数据损失 内容导航 一 进入阵列卡配置界面并查看硬盘状态 二 创建RAID0 1 5 6阵列 三 创建RAID10阵列 四 创建分卷的RA
  • 戴尔dell poweredge r730服务器系统安装配置详解教程

    这篇文章主要介绍了戴尔dell poweredge r730服务器系统安装配置详解教程 需要的朋友可以参考下 第一次给服务器安装的是ubantu系统 xff1b 首先我们开机进入小型BIOS设置一下RAID 或者进入服务器管理系统 xff0
  • Huawei交换机配置Telnet登录

    Huawei交换机配置Telnet登录 一 交换机开启Telnet服务 lt Huawei gt system view 进入系统视图 Huawei telnet server xff1f 查看有enable还是disable选项 xff0
  • Huawei设备配置系统时间

    系统时钟是设备上的系统时间戳 由于地域的不同 xff0c 用户可以根据当地规定设置系统时钟 用户必须正确设置系统时钟以确保其与其他设备保持同步 华为设备出厂时默认采用了协调世界时 UTC xff0c 但是没有配置时区所有在配置设备系统时钟前
  • A start job is running for Raise network interface(5min 13s )问题解决方法

    我在笔记本电脑上安装了Ubuntu 16 04 xff0c 当我有局域网连接时 xff0c 启动ubuntu是很快的 xff0c 当LAN电缆断开时 xff0c 需要大约5分钟才能获得登录屏幕 xff0c 这个实在是无法忍受 我的推测 xf
  • Linux常用浏览器

    1 火狐浏览器是一个安全高效的浏览器 xff0c 它具有速度快 隐私保护 丰富的插件资源 不同设备之间同步数据 分页浏览 个性化定制等特性 2 谷歌浏览器 谷歌浏览器是一个由Google公司开发的网页浏览器 xff0c 具有稳定 快速 安全
  • Ubuntu18.04 解压zip文件乱码的解决方法

    在Ubuntu的系统下解压zip文件的时候居然出现了乱码 xff0c 通过查找网上的资料 xff0c 解决的办法有两种 一 通过unzip行命令解压 xff0c 指定字符集 xff0c 由于zip格式中并没有指定编码格式 xff0c Win
  • /etc/resolv.conf文件详解

    etc resolv conf它是DNS客户机配置文件 xff0c 用于设置DNS服务器的IP地址及DNS域名 xff0c 还包含了主机的域名搜索顺序 该文件是由域名解析器 xff08 resolver xff0c 一个根据主机名解析IP地
  • CCF 201812-4 数据中心 Java

    一 题目 问题描述 试题编号 xff1a 201812 4试题名称 xff1a 数据中心时间限制 xff1a 1 0s内存限制 xff1a 512 0MB问题描述 xff1a 样例输入 4 5 1 1 2 3 1 3 4 1 4 5 2 3
  • QT 显示文件目录

    include lt QDir gt include lt iostream gt int main int argc char argv QCoreApplication app argc argv QDir dir dir setPat
  • 面向对象设计——系统动态模型设计(1,交互模型)

    在这张图中 xff0c 系统对象静态设计前边我们在分析中已经学习了 xff0c 这个阶段需要做的就是细化优化 这里我们主要学习系统设计 xff0c 这篇博客我们学习系统动态建模中交互模型建模 首先需要我们学习的是对象之间的通信 xff0c

随机推荐

  • 面向对象设计——系统动态模型设计(2,状态模型)

    这篇总结状态模型建模 xff1a 状态图和活动图 先看看状态图和活动图小结 xff1a 下边我们看一下 xff0c 状态图的事务 xff08 活动图的在前边的博客中已经给出 xff0c 活动图另一个大用处就是细化说明用例 xff09 xff
  • 【sql语句基础】——查(select)(单表查询)

    目录 查 select 单表查询基本语法表代码样例select注意事项 where子句排序order by子句合计 统计函数 count求和sum平均值avg最大值最小值max和min 分组group by过滤having 分页查询limi
  • 软件工程导论期末复习(一)

    本文用书 xff1a 软件工程导论 第六版 清华大学出版社 第一章 软件工程学概述 一 软件危机 1 什么是软件危机 xff1f 指在计算机软件开发和维护过程中所遇到的一系列严重问题 2 软件危机的典型表现 xff1a xff08 不怎么重
  • 软件工程导论期末复习(二)

    本文用书 xff1a 软件工程导论 第六版 清华大学出版社 1 可行性研究的目的是什么 xff1f 2 应从哪些方面研究可行性 xff1f 3 如何画系统流程图 xff1f 4 如何画数据流图 xff1f 5 了解数据字典及成本效益分析 第
  • 软件工程导论期末复习(三)

    本文用书 xff1a 软件工程导论 第六版 清华大学出版社 1 需求分析的基本任务是什么 xff1f 2 分析建模 2 1什么是模型 xff1f 模型 xff1a 就是为了理解事物而对事物做出的一种抽象 xff0c 是对事物的一种无歧义的书
  • 软件工程导论期末复习(四)

    本文用书 xff1a 软件工程导论 第六版 清华大学出版社 1 有穷状态机 2 peri网技术 第四章 形式化说明技术 4 1 概述 1 非形式化方法的缺点 用自然语言书写的系统规格说明书 可能存在矛盾 二义性 含糊性 不完整性及抽象层次混
  • 软件工程导论期末复习(五)

    本文用书 xff1a 软件工程导论 第六版 清华大学出版社 1 在设计过程中 xff0c 总体设计一般有哪两个主要阶段组成 xff1f 2 什么模块化 xff1f 模块独立性包含哪些内容 xff1f 度量准则是什么 xff1f 3 启发规则
  • 软件工程导论期末复习(六)

    本文用书 xff1a 软件工程导论 第六版 清华大学出版社 1 结构程序设计中有哪几种基本控制结构 xff1f 2 了解人机界面的设计 3 掌握过程设计的工具 xff08 程序流程图 盒图 PAD图 xff0c 判定树 xff09 4 面向
  • 技术人在互联网如何变现

    1 免费 xff08 引流的过程 xff09 免费的东西为什能够写到这里来 xff0c 天下哪有免费的午餐 xff0c 免费是实现流量聚集的手段 互联网无时无刻不体现免费的模式 xff0c 博客 各家文章平台 微博 公众号 短视频等等 xf
  • 软件工程导论期末复习(七)

    本文用书 xff1a 软件工程导论 第六版 清华大学出版社 1 编码 2 测试技术 3 调试的途径有哪些 xff1f 4 软件可靠性和可用性的基本概念 第七章 实现 7 1 编码 1 编码 xff1a 软件设计结果翻译成用某种程序语言书写的
  • 软件工程导论期末复习(八)

    本文用书 xff1a 软件工程导论 第六版 清华大学出版社 1 软件维护的定义 2 了解软件维护的特点 3 软件维护过程中维护组织包括哪些人员 xff1f 4 决定软件的可维护性的因素有哪些 xff1f 5 软件再工程过程 第八章 维护 8
  • 软件工程导论期末考试考后知识点总结

    感受 xff1a 大题多去做几道就可以 xff0c 难在记忆概念 xff0c 概念占篇幅近八成 xff0c 难受死了 第一章 1 软件危机的定义以及原因 2 软件工程的定义 3 软件工程方法学三要素 第二章 1 可行性研究的目的 2 数据流
  • linux操作--远程桌面RDP

    远程桌面RDP https www linuxidc com Linux 2018 10 155073 htm 相同的操作 xff1a https blog csdn net jgw2008 article details 80420180
  • Python工厂方法介绍及应用优化

    文章目录 前言一 工厂方法简单介绍1 统计信息2 简单实现 二 进一步优化具体实现1 抽象类及具体类部分2 工厂方法的封装3 用户调用接口 总结 前言 本文简单介绍设计模式中的工厂方法的实现方式及应用 文中所引用的模块及需要注意的事项 xf
  • Anaconda3 手动配置环境变量

    问题描述 Win 43 r 键打开系统运行对话框 xff0c 输入 cmd 回车 输入conda xff0c 显示 xff1a conda 不是内部或外部命令 xff0c 也不是可运行的程序或批处理文件 主要是因为安装 anaconda 时
  • xrdp_mm_process_login_response:login failed

    题外话 xff1a 被这个问题困扰了一个多钟 xff0c 百度搜索真的真的不如谷歌搜索 xff0c 最后是使用谷歌搜索一下子就找到适合自己的right answer xff01 问题描述 xff1a win10下远程桌面连接ubuntu服务
  • 使用SQl创建表单。查询,增加,修改删除,数据。

    使用SQl创建表单 查询 xff0c 增加 xff0c 修改删除 xff0c 数据 打开SQl数据库 右键数据库新建数据库 弹出新建数据库 xff0c 给数据库命名 左侧可以找到刚刚创建的数据库 选择刚刚创建滴数据库 xff0c 右键 表
  • Linux远程控制之VNC (server ,viewer)安装教程 || chkconfig

    VNC 可以实现对另外的计算机的操作 xff1a A xff1a 可以访问另一个计算机 xff0c 采用命令终端 或者窗口界面 B xff1a 可以远程控制另一个计算机 xff0c 两台同步显示操作 首先 xff0c 没有readme所说的
  • POJ 滑动窗口(优先队列的应用)

    数据结构与算法A 第三章 栈与队列 练习题 滑动窗口 思路 对于最大最小值分别维护一个优先队列 xff08 保存元素下标 xff09 以最小值为例 每次遇到一个新元素 xff0c 从队尾插入 插入时删去队列中比该值大的元素 xff08 因为
  • 数据结构:单链表头插法、尾插法、按值查找、按位查找、按位插入、删除、表长函数实现

    这里写目录标题 数据结构定义初始化头结点判断链表是否为空带头结点的按位序插入头插法尾插法按值查找 xff0c 返回节点按位查找 xff0c 返回节点将新节点插入到第i个位置删除第i个节点遍历输出求链表长度主函数测试各个功能完整代码 数据结构