当前位置:   article > 正文

单链表的插入、删除操作详解(C语言)_单链表的插入操作

单链表的插入操作

一、插入操作

(一)按位序插入(带头结点)

  • ListInsert(&L,i,e):插入操作。在表L的第i个位置上插入指定元素e。
  • 找到第i-1个结点,将新结点插入其后
    在这里插入图片描述
typedef struct LNode{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;

//在第i个位置插插入元素e(带头结点)
bool ListInsert(LinkList &L, int i, ElemType e){
	if(i<1)
		return false;
	LNode *p;		//指针p指向当前扫描到的结点
	int j=0;		//当前p指向的是第几个结点
	p = L;			//L指向头结点,头结点是第0个结点(不存数据)
	while(p != NULL && j<i-1){	//循环找到第i-1个结点
		p = p -> next;
		j++;
	}
	if( p == NULL) 	//i值不合法
		return false;
	//1.malloc申请新的结点空间
	LNode *s = (LNode *)malloc(sizeof(LNode));
	//2.将参数e存入新结点里面
	s -> data = e;
	//3.将s指向新结点e的next指针指向p结点next指向的位置
	s -> next = p -> next;
	//4.将p结点的next指针指向新的结点
	p -> next = s;	//将结点s连到p之后
		return true;//插入成功
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 分析:
    ①、如果i=1(插在表头)
    在这里插入图片描述
  • 注意:要先复制p结点next曾经指向的位置,然后再让p结点next指向新的结点。顺序不能颠倒。
    在这里插入图片描述
  • ②、如果i=3(插在表中)
    在这里插入图片描述
while(p!=NULL && j<i-1){//循环找到第2个结点
	p = p -> next;
	j++;
}
  • 1
  • 2
  • 3
  • 4
  • ③、如果i=5(插在表尾)
    在这里插入图片描述
  • ④、如果i=6(i > Length)
    在这里插入图片描述
  • 运行动态图:
    在这里插入图片描述

(二)按位序插入(不带头结点)

  • ListInsert(&L,i,e):插入操作。在表L的第i个位置上插入指定元素e。
  • 找到第i-1个结点,将新结点插入其后。
  • 不存在“第0个”结点,因此i=1时需要特殊处理。
    在这里插入图片描述
    在这里插入图片描述
  • ②、如果i>1…
    在这里插入图片描述

1. 指定结点的后插操作

typedef struct LNode{
	ElemType data;
	struct LNode *next;
}LNode, *LinkList;

//后插操作:在p结点之后插入元素e
bool InsertNextNode(LNode *p, ElemType e){
	if(p==NULL)
		return false;
	//1.malloc申请空间
	LNode *s = (LNode *)malloc(sizeof(LNode));
	if(s == NULL)		//内存分配失败
		return false;z
	//2.将数据元素e填到新结点当中
	s -> data = e;		//用结点s保存数据元素e
	//3.将p的next指向下一个元素赋值给新数据元素e的next指向下一个元素
	s -> next = p -> next;
	//4.将p的next指向新数据元素e
	p -> next = s;		//将结点s连接到p之后
	return true;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在这里插入图片描述

2. 指定结点的前插操作

  • 如何找到p结点的前驱结点?
    在这里插入图片描述
(1)通过传入头指针的方式实现

在这里插入图片描述

(2)通过复制插入位置的结点方式实现

在这里插入图片描述

二、删除操作

(一)按位序删除(带头结点)

  • ListDelete(&L,i,&e)删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。
  • 找到第 i-1 个结点,将其指针指向第i+1个结点,并释放第i个结点
  • 头结点可以看作“第0个”结点
typedef struct LNode{
	ElemType data;
	struct LNode *next;
}LNode, *LinkList;

bool ListDelete(LinkList &L, int i, ElemType &e){
	if(i<1)
		return false'
	LNode *p;		//指针p指向当前扫描到的结点
	int j=0;		//当前p指向的是第几个结点
	p = L;			//L指向头结点,头结点是第0个结点(不存储数据)
	while(p != NULL && j<i-1){	//循环找到第i-1个结点
		p = p->next;
		j++;
	}
	if(p == NULL)	//i值不合法
		return false;
	if(p -> next == NULL)		//第i-1个结点之后已没有其他结点
		return false;
	LNode *q = p -> next;		//令q指向被删除结点
	e = q -> data;				//用e返回元素的值
	p -> next = q -> next;		//将*q结点从链中“断开”
	free(q);					//释放结点的存储空间
	return true;				//删除成功
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 删除的结点如果i=4:
    在这里插入图片描述

(二)指定结点的删除

//删除指定结点 p
bool DeleteNode(LNode *p)
  • 1
  • 2

在这里插入图片描述

  • 删除结点p,需要修改其前驱结点的 next 指针
1. 传入头指针,循环寻找 p 的前驱结点

在这里插入图片描述

  • 动态运行图:
    在这里插入图片描述
  • 如果p是最后一个结点:
    在这里插入图片描述
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/859759
推荐阅读
相关标签
  

闽ICP备14008679号