1 在指定位序插入数据
第一步 
 主要执行操作:查找
 先查找所要插入位置的前一个元素 
具体方法:根据链表的特点-每一个节点都需要一个数据域和指针域 
所以只需从头节点遍历到所要插入数据的的前一个节点即可

后面的showList函数也用的这种方法
第二步
 主要执行操作:插入 
 创建一个新节点s(名称无所谓)给s的数据域赋值为e(e即你所要插入的数据) 代码如下演示

2 在指定位置后插入数据
第一步   和1操作只有一个地方不一致,只需把查找的代码中i-1 变为 i 即可 
第二步 
和1的第二部操作一致

3 在指定位置前插入数据
第一种方法 
可以根据每个节点都有一个指针域来处理
即通过从头节点遍历到所要插入节点的前一个节点 
时间复杂度为O(n)  问题规模n为插入的位序
第二种方法
 我们换一种思路 即交换所要插入节点和所要插入节点前的节点的值 
即可完成插入 时间复杂度为O(1)  比第一种更省时,方便,简洁试试

代码如下:

s->next = p->next;
    p->next = s; // 新节点s连到p节点之后
    s->data = p->data; // 利用交换数据来插入节点
    p->data = e;

add:

如果想直接在节点插入的话把上面那部分代码修改下面代码即可:

int ListInsertPriorNode(LNode* p, int e) // 在指定元素前面进行插入操作
{
    if (p == NULL)
    {
        cout << "你所插入的节点不存在" << endl;
        exit(0);
    }
    LNode* s = (LNode*)malloc(sizeof(LNode)); // 创建新节点s
    if (s == NULL)
    {
        cout << "内存分配失败" << endl;
        exit(0);
    }
    s->next = p->next;
    p->next = s; // 新节点s连到p节点之后
    s->data = p->data; // 利用交换数据来插入节点
    p->data = e;
    return e; // 返回插入的元素
}

完整代码如下:

#include<iostream>
#include<stdio.h> // malloc函数头文件
using namespace std;
typedef struct LNode
{
    int data; // 数据域
    LNode* next; // 节点域
}LNode,*LinkList;
void InitList_Head(LinkList& L, int n) // 初始化单链表
{
    L = (LNode*)malloc(sizeof(LNode)); // 创建节点
    if (L == NULL)
    {
        cout << "创建节点失败" << endl;
        exit(0); // 退出程序
    }
    L->next == NULL;  // 链表设空
    cout << "请输入数据" << endl;
    LNode* s;
    LNode* r; // 尾指针
    r = L; // 把L赋给r
    for (int i = 1; i <= n; i++) 
    {
        s = (LNode*)malloc(sizeof(LNode)); // 创建新节点s
        scanf_s("%d", &(s->data)); // 创建新节点 
        r->next = s; // 尾插法初始化链表
        r = s;
    }
    r->next = NULL; //尾节点指向空节点
}
int ListInsert(LinkList& L, int i, int e) // 在指定位置上插入数据
{
    if (i < 1) 
    {
        cout << "您所插入的位置不存在" << endl;
        exit(0);
    }
    LNode* p; // 指向p指向当前扫描到的节点
    int j = 0; // 当前p指向的第几个节点 计数
    p = L; // L指向头结点
    while (p != NULL && j < i- 1) // 找到所插入节点i的前一个节点
    {
        p = p->next;
        j++;
    }
    if (p == NULL) // i值不合法
    {
        exit(0);
    }
    LNode* s ;
    s = (LNode*)malloc(sizeof(LNode)); // 创建新节点s
    s->data = e; // 赋值
    s->next = p->next;
    p->next = s;  // 把s节点连在p节点之后
    return e; // 返回所插入的数据
}
int ListInsertNext(LinkList &L, int i, int e) // 指定节点的后插操作
{
    if (i < 1)
    {
        cout << "插入位置不合法" << endl;
        exit(0);
    }
    LNode* p; // 指向p指向当前扫描到的节点
    int j = 0; // 当前p指向的第几个节点 计数
    p = L; // L指向头结点
    while (p != NULL && j < i ) // 找到所插入节点i节点
    {
        p = p->next;
        j++;
    }
    if (p == NULL) // i值不合法
    {
        exit(0);
    }
    LNode* s;
    s = (LNode*)malloc(sizeof(LNode)); // 创建新节点s
    s->data = e; // 赋值
    s->next = p->next;
    p->next = s;  // 把s节点连在p节点之后
    return e; // 返回所插入的数据
}

int ListInsertPriorNode(LinkList& L, int i, int e)
{
    if (i < 1)
    {
        cout << "插入位置不合法" << endl;
        exit(0);
    }
    LNode* p; // 指向p指向当前扫描到的节点
    int j = 0; // 当前p指向的第几个节点 计数
    p = L; // L指向头结点
    while (p != NULL && j < i) // 找到所插入节点i节点
    {
        p = p->next;
        j++;
    }
    if (p == NULL) // i值不合法
    {
        exit(0);
    }
    LNode* s;
    s = (LNode*)malloc(sizeof(LNode)); // 创建新节点s
    s->next = p->next;
    p->next = s; // 新节点s连到p节点之后
    s->data = p->data; // 利用交换数据来插入节点
    p->data = e;
    return e; // 返回插入的元素
}
void showList(LinkList& L)
{
    LNode* p;
    p = (LNode*)malloc(sizeof(LNode)); // 创建新节点p
    p = L->next;  
    while (p != NULL) // 遍历
    {
        cout << p->data << endl;  
        p = p->next;
    }
}
int main()
{
    LinkList L; // 创建一个单链表
    InitList_Head(L, 5); // 表中有五个数据
    //int a = ListInsert(L,3,4); // 指定位序插入
    //cout << "插入的数据为" << a << endl;
    //int b = ListInsertNext(L, 3, 5); // 指定位序后插入
    //cout << "插入的数据为" << b << endl;
    int c = ListInsertPriorNode(L, 3, 2); // 指定位序前插入
    cout << "插入的数据为" << c << endl;
    showList(L);
}

单链表的插入操作(全)相关推荐

  1. 单链表的插入操作的实现(0952)SUWST-OJ

    Description 建立长度为n的单链表,在第i个结点之前插入数据元素data. Input 第一行为自然数n,表示链式线性表的长度:第二行为n个自然数表示链式线性表各元素值:第三行为指定插入的位 ...

  2. 西南科技大学 swust oj #952: 单链表的插入操作的实现

    题目描述 建立长度为n的单链表,在第i个结点之前插入数据元素data. 输入 第一行为自然数n,表示链式线性表的长度: 第二行为n个自然数表示链式线性表各元素值: 第三行为指定插入的位置i:第四行为待 ...

  3. 顺序表和单链表的插入删除操作时间复杂度的区别

    顺序表和单链表的插入删除操作时间复杂度的区别 最近在学习数据结构,看到如果需要用到大量的插入和删除操作,单链表的效率会高于顺序表.看到这里时内有有个疑惑,这两种数据结构的插入和删除操作的时间复杂度不都 ...

  4. 【 C 】在单链表中插入一个新节点的尝试(二)

    在上篇博文中:[ C ]在单链表中插入一个新节点的尝试(一),我们最后提到了如果向单链表的开头(起始位置)插入一个节点,上篇博文中给出的程序显然完成不了这任务. 这篇博文中,我们将解决这个问题,给出一 ...

  5. 【 C 】在单链表中插入一个新节点的尝试(一)

    根据<C和指针>中讲解链表的知识,记录最终写一个在单链表中插入一个新节点的函数的过程,这个分析过程十分的有趣,准备了两篇博文,用于记录这个过程. 链表是以结构体和指针为基础的,所以结构体和 ...

  6. java 结构体_Java实现单链表的简单操作

    文章目录 前言 一.基本实现思路 二.代码实现 1.定义结点类2.定义链表类3.测试调用4.结果 总结 前言 用Java实现单链表的简单操作,阅读本文和上一篇文章体会Java中类与C++中结构体指针的 ...

  7. 数据结构(单链表的相关操作)

    为什么80%的码农都做不了架构师?>>>    #include <stdio.h> #include <stdlib.h> #define ElemType ...

  8. 单链表的实现操作(C语言)

    //单链表的实现操作 #include <stdio.h> #include <malloc.h> #include <stdlib.h> //数据类型定义 typ ...

  9. 单链表的简单操作与演示

    单链表的简单操作与演示 单链表 单链表概念和简单的设计 单链表是一种链式存取的数据结构,链表中的数据是以结点来表示的,每个结点由元素和指针构成. 元素表示数据元素的映象,就是存储数据的存储单元:指针指 ...

最新文章

  1. java中对Excel的创建、样式修改
  2. iOS进阶 - iOS如何监控崩溃
  3. Maven依赖中的scope详解
  4. Python运算符优先级
  5. mybatis中mapper.xml命名空间错误
  6. 前嗅ForeSpider教程:采集图片/视频/资源文件的链接地址 1
  7. SpringBoot整合Sharding-JDBC实现水平分库分表
  8. B站飞机大战源码、素材
  9. 不格式化U盘的情况下部署WinPE
  10. 车辆工程计算机发展前景,车辆工程专业就业方向有哪些 就业前景怎么样
  11. 超详细的八种RAID磁盘阵列原理及优缺点
  12. 阿里云云计算助理工程师认证(ACA)详细解读
  13. 年底个人安全注意事项
  14. Ubuntu红外相机SDK/驱动安装(optris PI 400i / PI 450i)
  15. Springboot项目全局异常统一处理
  16. nginx配置深析1
  17. 下了个蓝屏代码查看工具,就中病毒了。。。什么鬼病毒,竟然还是用的VBS
  18. Centos - top 命令详解
  19. hadoop常用命令及端口
  20. 【数据服务校招专场】云和恩墨2022届春季校招「数据服务岗位」持续招聘中!...

热门文章

  1. 2020年遥感类期刊SCI期刊影响因子排名—遥感, 地理, 水文类
  2. 在godot的canvas_item着色器中构建逆投影矩阵和逆视图矩阵
  3. linux视频对话框,抖音对话框视频怎么做?如何在视频画面上添加对话气泡框?视频加对话气泡的方法...
  4. BNUOJ 4140 Video Game Troubles
  5. ONLYOFFICE历史版本开发技术之二
  6. python红楼梦作者_用 Python 分析《红楼梦》,后四十回是曹雪芹所写吗?(开源)...
  7. 使用python将多张图片拼接成大图
  8. 电脑插了耳机,外放还有声音-解决办法
  9. c语言win32api勾取,第一次用C语言+win32api写窗体应用程序,晕死了
  10. 根据股票涨跌用KMeans进行分类