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 ...
随机推荐
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(四)
在上一讲中,我们已经完成了一个完整的案例,在这个案例中,我们可以通过Angular单页面应用(SPA)进行登录,然后通过后端的Ocelot API网关整合IdentityServer4完成身份认证.在 ...
- Keepalived 原理与实战
Keepalived 原理与实战 随着系统架构的逐渐演化,服务器的数量和结构会越来越复杂,例如 Web 服务器集群的搭建,提高了系统的性能,同时也提高了系统维护的复杂度,我们需要对集群中各台服务器进行 ...
- Mycat-多实例的搭建
1. 基础环境准备1.1 环境准备:两台虚拟机 db01 db02每台创建四个mysql实例:3307 3308 3309 33101.2 删除历史环境:pkill mysqldrm -rf /dat ...
- webpack-dev-server 使用 react-router 启用 browserhistory 采坑记
问题的产生 今天下午请假,忙完手头事之后,在家实在无聊,想着从0开始搭建一个 react 的项目.webpack 基本配置之前研究过,没什么大问题.谁想,在 react-router 的配置时出现了个 ...
- jQuery——选择器效率
N1:$('#box').find('p'):最快,直接了当的找到对应的节点jQuery对象: N2:$('p','#box'):注意不是$('p,#box')!!!,jQuery会按照从右往左的顺序 ...
- 【python系统学习16】编码基础知识
编码 计算机是怎么传输和存储数据的? 就是把人类认识的中英文字.其他国家语言.数字甚至运算符等符号转成二进制的0.1,并进行存储和传输. 编码 人类语言:中英文字.其他国家语言.数字甚至运算符等符号 ...
- ## H5 canvas画图白板踩坑
最近接手了一个小型的H5,最主要的功能大概就是拍照上传和canvas画板了. 主要是记录一下自己菜到像傻子一样的技术. 1.canvas画板隔空打牛!画布越往上部分错位距离越小,越往下距离越大. 2. ...
- Rocket - debug - TLDebugModuleInner - HALTSUM
https://mp.weixin.qq.com/s/elOGjaVCWc48gs9c_cTqww 简单介绍TLDebugModuleInner中HALTSUM寄存器的实现. 1. numHalted ...
- Java-接口概念辨析
https://mp.weixin.qq.com/s/HQZhlS-ffgEMqhB2rHax1w 1. 类 是属性成员和方法成员的集合:2. 父类 是子类相同属性成员和方法成 ...
- 【Tomcat】JSP使用Session、Cookie实现购物车
购物界面shop.jsp 初始页面 添加商品后,在session中设置属性,重定向回到shop.jsp,然后根据session的内容显示结果 Cookie设置setMaxAge可以延长session的 ...