单链表实现“插入”和“删除”操作

在单链表中,又如何实现“插入”和“删除”操作呢?

插入操作:

假设我们要在线性表的两个数据元素a和b之间插入一个数据元素x,已知p为其单链表存储结构中指向结点a的指针。为插入数据元素x,首先要生成一个数据域为x的结点,然后插入在单链表中。根据插入操作的逻辑定义,还需修改结点a中的指针域,令其指向结点x,而结点x中的指针域应该指向b结点,从而实现3个元素a,b和x之间逻辑关系的变化。

假设s为指向结点x的指针。则上述指针修改用语句描述即为:

s->next=p->next;

p->next=s;

删除操作:

如果在线性表中删除元素b时,为在单链表中实现元素a,b和c之间逻辑关系的变化,仅需要修改结点a中的指针域即可。假设p为指向结点a的指针,则修改指针的语句为:

p->next=p->next->next;

由以上可知,在已知链表中元素插入或删除的确切位置的情况下,在单链表中插入或删除一个结点时,仅需修改指针为不需要移动元素。

插入函数ListInsert_L:要求是在已知链表中的确切位置插入一个结点。所以需要向函数内传递已知链表L,插入的确切位置i,以及即将插入的结点数据元素e。

ListInsert_L(LinkList &L,int i,ElemType e)

{

//第一步:将链表的头结点的指针域单链表存储结构的指针p

p=L;//&L即为链表L的的头结点地址

j=0;//计数器

//第二步:找到在将在链表i处,即要插入新结点的位置。

//方法:先找到链表i-1处的结点。此结点的指针域即指向i处结点的指针域

while(p&&j<i-1)

{

p=p->next;//p->next是指向第j+1个数据元素的指针

++j;//

}

//第三步:判断是否越界已知链表

//如果i小于1或者大于表长+1,即越界,则返回错误

if(!p||j>i-1)

return ERROP;

//第四步:找到i出结点,新建一个结点(包括数据域和指针域)代表即将插入的结点

//生成新结点

s=(LinkList)malloc(sizeof(LNode));//新结点s

s->data=e;//新结点的数据域赋值为将插入的数据元素e

//因为原来i处结点指针域p保存着指向下一个i+1处结点的指针域。

//要插入新结点,即原来i+1处的结点变为i+2处的几点,新建结点变为i+1处的结点

//即新建结点指向原来i+1处的结点的指针域,所以s->next=p->next

//因为此时p代表的是i处的结点,p->代表i+1处的结点指针域赋值给新结点指针域

s->next=p->next;

//因为此时p代表的是i处的结点,p->next代表i+1处的结点指针域赋值给新结点指针域

//完成插入操作时,新建结点s变为i+1处的结点。所以p->next指向s,即将s赋值给p->next.

p->next=s;

return OK;

}

时间: 2024-11-03 22:09:14

单链表实现“插入”和“删除”操作的相关文章

面试之路(10)-BAT面试之java实现单链表的插入和删除

链表的结构: 链表在空间是不连续的,包括: 数据域(用于存储数据) 指针域(用于存储下一个node的指针) 单项链表的代码实现: 节点类 构造函数 数据域的get,set方法 指针域的get,set方法 代码: public class Node { Object element; //数据域 Node next; //指针域 //构造方法 public Node(Object obj, Node nextval) { this.element = obj; this.next = nextva

Partition List(链表的插入和删除操作,找前驱节点)

Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. You should preserve the original relative order of the nodes in each of the two partitions. For example,Given 1->4->3->2

单链表的插入和删除

1 #define OKO 1 2 #define ERROR 0 3 typedef struct Lnode{ 4 ElemType data;//数据域 5 struct Lnode *next; //指针域 6 }Lnode,*Linklist; 7 Lnode *LocateElem_L(Linklist L,Elemtype e){ 8 //在链表中查找值为e的数据元素 9 Lnode *p; 10 p=L->next; 11 while(p&&p->data!=e

使用OC实现单链表:创建、删除、插入、查询、遍历、反转、合并、判断相交、求成环入口

一.概念 链表和数组都是一种线性结构,数组有序存储的,链表是无序存储的. 数组中的每一个元素地址是递增或者递减的关系,链表的每一个节点的地址没有此规律,它们是通过指针的指向连接起来. 链表种类:单链表.双向链表.循环链表.双向循环链表 单链表:一个数据域data.一个后继指针域next.也即:上一个节点指向下一个节点,尾节点指向空. 双向链表:一个数据域data.一个前驱指针域previous.一个后继指针域next.也即:上一个节点和下一个节点互相指向,尾节点指向空. 循环链表:一个数据域da

数据结构Java实现03----单向链表的插入和删除

数据结构Java实现03----单向链表的插入和删除 文本主要内容: 链表结构 单链表代码实现 单链表的效率分析 一.链表结构:            概念: 链式存储结构是基于指针实现的.我们把一个数据元素和一个指针称为结点.   数据域:存数数据元素信息的域. 指针域:存储直接后继位置的域. 链式存储结构是用指针把相互直接关联的结点(即直接前驱结点或直接后继结点)链接起来.链式存储结构的线性表称为链表. 链表类型: 根据链表的构造方式的不同可以分为: 单向链表 单向循环链表 双向循环链表 二

二叉平衡树的插入和删除操作

1.      二叉平衡树 二叉排序树的时间复杂度和树的深度n有关.当先后插入的结点按关键字有序时,二叉排序树退化为单枝树,平均查找长度为(n+1)/2,查找效率比较低.提高查找效率,关键在于最大限度地降低树的深度n.因此需要在构成二叉排序树的过程中进行“平衡化”处理,使之成为二叉平衡树. 二叉平衡树,又称AVL树.它或者是一棵空树,或者是具有下列性质的树: 1)      具备二叉排序树的所有性质: 2)      左子树和右子树深度差的绝对值不超过1: 3)      左子树和右子树都是二叉

二叉查找树(二叉排序树)创建,插入,删除操作。

二叉排序树 二叉排序树是一个基础的树的数据结构.应用非常多. 它的特性就是,左孩子小于parent,右孩子大于parent. 寻找节点 寻找节点就是直接根据数值的大小,从root节点开始遍历,大于当前遍历节点就向它的右子树查找,相反则查找它的左子树.然后返回. 查找最大最小节点 直接根据root节点,遍历到最右就是最大节点,遍历到最左,就是最小节点. 插入节点 插入节点我这里插入的节点都会成为叶子节点.根据大小的关系向下遍历,遍历到最后的节点,然后插入就可以了. 删除节点 这里删除节点是相对麻烦

单链表顺序插入

向单链表中插入新元素,并保证插入后,元素是有序的. [程序实例] 1 struct ListNode 2 { 3 int val; 4 ListNode *next; 5 }; 6 7 bool sll_insert(ListNode **root, int value) 8 { 9 ListNode *PrevNode =NULL; 10 ListNode *Current = *root; 11 12 while (Current!=NULL && Current->val<

单链表 - 插入和删除操作

下图展示了单链表的基本结构: head指针是链表的头指针,指向第一个节点,每个节点的next指针域指向下一个节点,最后一个节点的next指针域为NULL,在图中用0表示. 下面先来看程序(栈的链式存储实现,另外一个实现点这里)和对应的输出(注意输出前进行了链表反转(见<单链表反转>,否则程序后面的while循环输出的顺序是250,200,100),接着来分析程序: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22