单链表的插入操作(全)
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);
}
单链表的插入操作(全)相关推荐
- 单链表的插入操作的实现(0952)SUWST-OJ
Description 建立长度为n的单链表,在第i个结点之前插入数据元素data. Input 第一行为自然数n,表示链式线性表的长度:第二行为n个自然数表示链式线性表各元素值:第三行为指定插入的位 ...
- 西南科技大学 swust oj #952: 单链表的插入操作的实现
题目描述 建立长度为n的单链表,在第i个结点之前插入数据元素data. 输入 第一行为自然数n,表示链式线性表的长度: 第二行为n个自然数表示链式线性表各元素值: 第三行为指定插入的位置i:第四行为待 ...
- 顺序表和单链表的插入删除操作时间复杂度的区别
顺序表和单链表的插入删除操作时间复杂度的区别 最近在学习数据结构,看到如果需要用到大量的插入和删除操作,单链表的效率会高于顺序表.看到这里时内有有个疑惑,这两种数据结构的插入和删除操作的时间复杂度不都 ...
- 【 C 】在单链表中插入一个新节点的尝试(二)
在上篇博文中:[ C ]在单链表中插入一个新节点的尝试(一),我们最后提到了如果向单链表的开头(起始位置)插入一个节点,上篇博文中给出的程序显然完成不了这任务. 这篇博文中,我们将解决这个问题,给出一 ...
- 【 C 】在单链表中插入一个新节点的尝试(一)
根据<C和指针>中讲解链表的知识,记录最终写一个在单链表中插入一个新节点的函数的过程,这个分析过程十分的有趣,准备了两篇博文,用于记录这个过程. 链表是以结构体和指针为基础的,所以结构体和 ...
- java 结构体_Java实现单链表的简单操作
文章目录 前言 一.基本实现思路 二.代码实现 1.定义结点类2.定义链表类3.测试调用4.结果 总结 前言 用Java实现单链表的简单操作,阅读本文和上一篇文章体会Java中类与C++中结构体指针的 ...
- 数据结构(单链表的相关操作)
为什么80%的码农都做不了架构师?>>> #include <stdio.h> #include <stdlib.h> #define ElemType ...
- 单链表的实现操作(C语言)
//单链表的实现操作 #include <stdio.h> #include <malloc.h> #include <stdlib.h> //数据类型定义 typ ...
- 单链表的简单操作与演示
单链表的简单操作与演示 单链表 单链表概念和简单的设计 单链表是一种链式存取的数据结构,链表中的数据是以结点来表示的,每个结点由元素和指针构成. 元素表示数据元素的映象,就是存储数据的存储单元:指针指 ...
最新文章
- java中对Excel的创建、样式修改
- iOS进阶 - iOS如何监控崩溃
- Maven依赖中的scope详解
- Python运算符优先级
- mybatis中mapper.xml命名空间错误
- 前嗅ForeSpider教程:采集图片/视频/资源文件的链接地址 1
- SpringBoot整合Sharding-JDBC实现水平分库分表
- B站飞机大战源码、素材
- 不格式化U盘的情况下部署WinPE
- 车辆工程计算机发展前景,车辆工程专业就业方向有哪些 就业前景怎么样
- 超详细的八种RAID磁盘阵列原理及优缺点
- 阿里云云计算助理工程师认证(ACA)详细解读
- 年底个人安全注意事项
- Ubuntu红外相机SDK/驱动安装(optris PI 400i / PI 450i)
- Springboot项目全局异常统一处理
- nginx配置深析1
- 下了个蓝屏代码查看工具,就中病毒了。。。什么鬼病毒,竟然还是用的VBS
- Centos - top 命令详解
- hadoop常用命令及端口
- 【数据服务校招专场】云和恩墨2022届春季校招「数据服务岗位」持续招聘中!...
热门文章
- 2020年遥感类期刊SCI期刊影响因子排名—遥感, 地理, 水文类
- 在godot的canvas_item着色器中构建逆投影矩阵和逆视图矩阵
- linux视频对话框,抖音对话框视频怎么做?如何在视频画面上添加对话气泡框?视频加对话气泡的方法...
- BNUOJ 4140 Video Game Troubles
- ONLYOFFICE历史版本开发技术之二
- python红楼梦作者_用 Python 分析《红楼梦》,后四十回是曹雪芹所写吗?(开源)...
- 使用python将多张图片拼接成大图
- 电脑插了耳机,外放还有声音-解决办法
- c语言win32api勾取,第一次用C语言+win32api写窗体应用程序,晕死了
- 根据股票涨跌用KMeans进行分类