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 ...
随机推荐
- Spring Boot在Docker上的部署
一.准备工作 1.1 安装Docker环境 Docker 给旧版本的WIN系统提供的是Docker Toolbox下载(https://docs.docker.com/toolbox/overview ...
- uniapp打包发版到linux服务器步骤----H5端
最近在写uni-app项目,项目打包部署到服务器后,搞了好一会一直打开是空白页,原来自己有几个地方疏忽了,现把步骤整理一下: 第1步:编辑配置 mainifest.json 文件 tip:运行的基础路 ...
- vue触发事件的五个关键字
v-on vue中提供了v-on事件绑定 v-on:click='函数'; v-on可以使用@代替 vue 五个触发事件关键字 .stop 用于阻止冒泡 例如 div1 ...
- 第3章_关系数据库标准语言(SQL)_006_由元组关系演算到SQL Command_001_蕴含式 (其中有对EXISTS的分析)
前序的链接:元组关系演算 六. 蕴含式 ===>1. 什么是“蕴含式”===>设p.q为两个命题.复合命题“如果p,则q”称为p与q的蕴含式,记作p→q,并称p为蕴含式的前件,q为后件.定 ...
- Typora Ubuntu 不显示 加粗
问题描述: Typora 在 Ubuntu18.04 上面不显示 Markdown 加粗语法 解决办法: 在 Typora's github.css 里面,将 body 修改为如下内容 body { ...
- Javascript书写位置
1.行内式js(很少使用) 以on开头,如onclick HTML中推荐双引号,JS推荐单引号 2.内嵌式js(常用) <script> alert('hello world'); < ...
- Java中的集合(五)继承Collection的List接口
Java中的集合(五)继承Collection的List接口 一.List接口简介 List是有序的Collection的,此接口能够精确的控制每个元素插入的位置.用户能够根据索引(元素在List接口 ...
- 应用4:利用Filter限制用户浏览权限
1. 使用 Filter 完成一个简单的权限模型: 1). 需求: ①. 管理权限 > 查看某人的权限 > 修改某人的权限 ②. 对访问进行权限控制: 有权限则可以访问, 否则提示: 没有 ...
- 泛微 e-cology OA 前台SQL注入
poc https://github.com/AdministratorGithub/e-cology-OA-SQL 用法:python elog_sql.py http://target 不存在返回 ...
- (二)用less+gulp+requireJs 搭建项目(gulp)
gulp是自动化构建工具,基于node,需要安装node,如果你不了解node也没关系,先跟着来一遍再去了解node也不迟~ 首先去node官网下载安装包 1.新建项目文件夹 在目录下shift+右键 ...