DS-4-单链表的各种插入与删除的实现
typedef struct LNode {
int data;
struct LNode *next;
}LNode, *LinkList;
带头结点的按位序插入:
//在第i个位置插入元素e
bool ListInsert(LinkList &L, int i, char e) {
if (i < )
return false; LNode *p; //p指向当前扫描到的结点
int j = ; //当前p指向的是第几个结点
p = L; //L指向头结点,第0个结点
while (p != NULL && j < i - ) { //循环找到要插入结点的前一个结点
p = p->next;
j++;
} if (p == NULL) //i值不合法(最后一个结点指向NULL,这是要在NULL的后边插入)
return false;
LNode *s = (LNode *)malloc(sizeof(LNode)); //新结点
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
不带头结点的按位序插入:(对于插入第一个结点时需要特殊处理,其他部分与带头结点的一样)
bool ListInsert(LinkList &L, int i, char e) {
if (i == ) {
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = L;
L = s;
return true
}
if (i < )
return false;
LNode *p; //p指向当前扫描到的结点
int j = ; //当前p指向的是第几个结点
p = L; //L指向头结点,第0个结点
while (p != NULL && j < i - ) { //循环找到要插入结点的前一个结点
p = p->next;
j++;
}
if (p == NULL) //i值不合法(最后一个结点指向NULL,这是要在NULL的后边插入)
return false;
LNode *s = (LNode *)malloc(sizeof(LNode)); //新结点
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
指定结点的后插操作:
//在p结点之后插入元素e
bool InsertNextNode(LNode *p, char e) {
if (p == NULL)
return false;
LNode *s = (LNode *)malloc(sizeof(LNode));
if (s == NULL)
return false; //内存分配失败
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
这里的后插操作其实就相当于已经找到了p,和按位序插入while循环后边的代码一样了,所以按位序插入后边部分可以调用这个函数:
//在第i个位置插入元素e
bool ListInsert(LinkList &L, int i, char e) {
if (i < )
return false; LNode *p; //p指向当前扫描到的结点
int j = ; //当前p指向的是第几个结点
p = L; //L指向头结点,第0个结点
while (p != NULL && j < i - ) { //循环找到要插入结点的前一个结点
p = p->next;
j++;
}
return InsertNextNode(p,e)
}
指定结点的前插操作:
如果给了头指针的话,只需要循环查找到要插入结点的前一个结点,然后插入即可
//在p结点之前插入元素e
bool InsertPriorNode(LinkList L, LNode *p, char e)
然而如果不给头指针的话,就需要偷天换日一下,把新结点插入到p结点后边,然后把新结点的数据元素和和p结点互换,逻辑上实现同样的效果
//在p结点之前插入元素e
bool InsertPriorNode(LNode *p, char e) {
if (p == NULL)
return false;
LNode *s = (LNode *)malloc(sizeof(LNode));
if (s == NULL)
return false; //内存分配失败
s->next = p->next;
p->next = s;
s->data = p->data;
p->data = e;
return true;
}
如果是直接传入了结点s,道理是一样的;
//在p结点之前插入结点s
bool InsertPriorNode(LNode *p, LNode *s) {
if (p == NULL || s == NULL)
return false;
s->next = p->next;
p->next = s;
char temp = p->data;
p->data = s->data;
s->data = temp;
return true;
}
按位序删除(带头结点):
前半部分与插入结点一样,先循环查找p
//删除表L中第i个位置的元素,并用e返回删除元素的值
bool ListDelete(LinkList &L, int i, char &e) {
if (i < )
return false; LNode *p; //p指向当前扫描到的结点
int j = ; //当前p指向的是第几个结点
p = L; //L指向头结点,第0个结点
while (p != NULL && j < i - ) {
p = p->next;
j++;
} if (p == NULL)
return false;
if (p->next == NULL)
return false;
LNode *q = p->next; //令q指向被删除的结点
e = q->data; //用e返回被删的值
p->next = q->next; //断开连接
free(q); //释放被删结点空间
return true;
}
指定结点的删除:
删除结点p,需要修改其前驱 结点的next指针
方法1:传入头指针,循环寻找p的前驱结点
方法2:偷天换日(类似于结点前插的实现)
下面是方法2的代码实现:
//删除指定结点p
bool DeleteNode(LNode *p) {
if (p == NULL)
return false;
LNode *q = p->next; //令q指向*p的后继结点
p->data = p->next->data;
p->next = q->next;
free(q);
return true;
}
如果p是最后一个结点就只能从表头开始依次寻找p的前驱...
DS-4-单链表的各种插入与删除的实现的更多相关文章
- Python实现单链表数据的添加、删除、插入操作
Python实现单链表数据的添加.删除.插入操作 链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结 ...
- C语言习题 链表建立,插入,删除,输出
Problem B: C语言习题 链表建立,插入,删除,输出 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 222 Solved: 92 [Subm ...
- SDUT OJ 数据结构实验之链表七:单链表中重复元素的删除
数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem ...
- YTU 2430: C语言习题 链表建立,插入,删除,输出
2430: C语言习题 链表建立,插入,删除,输出 时间限制: 1 Sec 内存限制: 128 MB 提交: 576 解决: 280 题目描述 编写一个函数creatlink,用来建立一个动态链表 ...
- SDUT-2122_数据结构实验之链表七:单链表中重复元素的删除
数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 按照数据输入的相反顺序(逆 ...
- C语言双链表遍历,插入,删除
#include<stdio.h> #include<stdlib.h> #include <string.h> #define bzero(a, b) memse ...
- Problem A: C语言习题 链表建立,插入,删除,输出
#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct student { l ...
- 数据结构实验之链表七:单链表中重复元素的删除(SDUT 2122)
#include <bits/stdc++.h> using namespace std; typedef struct node { int data; struct node* nex ...
- 单链表的插入删除操作(c++实现)
下列代码实现的是单链表的按序插入.链表元素的删除.链表的输出 // mylink.h 代码 #ifndef MYLINK_H #define MYLINK_H #include<iostream ...
随机推荐
- CF1340B Nastya and Scoreboard(暴搜剪枝/dp)
Question 一个n个数码位的分数板,每一个数码位都是一个七段数码管,现在给出每个数码位的显示情况,问再点亮k段数码管的话能显示的最大的数是多少,如果不能构成一串数字,就输出-1 Solution ...
- 【C++】运算符优先级和结合性
从上表可以大致总结这样一个规律: 优先级 运算符 高 初等运算符 | 单目运算符 | 算术运算符(先乘除,后加减) | 关系运算符 | 逻辑运算符(不包括!) | 条件运算符 ↓ 赋值运算符 低 逗号 ...
- [Python番外]001.用Sublime开发Python
用Sublime开发Python 准备 安装Package Control插件 安装Python插件 Python环境配置 修改快捷键 准备 安装Python 详见 Python准备 下载Sublim ...
- Library source does not match the bytecode for class 最佳解决方案
首先分析问题 打完的jar包,编译的后class跟java文件不一致,原因是重新打包后还是引用之前的java文件,不能重新加载新生成的jar. 解决方案 方案一 IDEA 工具,点击File > ...
- git的相关基础操作
一.git安装 从https://git-scm.com/下载相应版本安装即可,一路默认安装到底即可,安装目录可以自行选择 二.git配置 安装完git后在任意文件夹内单击鼠标右键,会出现Git GU ...
- hexo搭建个人网站及hexo+nginx部署个人网站
先放个配置好了 server { # 监听端口 listen ; # 监听ip 换成服务器公网IP server_name mr-lin.site; location / { root /web/my ...
- 用python做时间序列预测一:初识概念
利用时间序列预测方法,我们可以基于历史的情况来预测未来的情况.比如共享单车每日租车数,食堂每日就餐人数等等,都是基于各自历史的情况来预测的. 什么是时间序列? 时间序列,是指同一个变量在连续且固定的时 ...
- Nginx 笔记(三)nginx 配置实例 - 反向代理、负载均衡、动静分离
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.反向代理 反向代理准备工作: (1)在 liunx 系统安装 tomcat,使用默认端口 8080 ...
- Java实现 蓝桥杯 算法提高 分解质因数(暴力)
试题 算法提高 分解质因数 问题描述 给定一个正整数n,尝试对其分解质因数 输入格式 仅一行,一个正整数,表示待分解的质因数 输出格式 仅一行,从小到大依次输出其质因数,相邻的数用空格隔开 样例输入 ...
- Java实现统计方案
统计方案 题目描述 在一无限大的二维平面中,我们做如下假设: 1.每次只能移动一格: 2.不能向后走(假设你的目的地是"向上",那么你可以向左走,可以向右走,也可以向上走,但是不可 ...