Bootstrap

单链表的插入和删除(带头结点与不带头结点)

单链表的插入和删除

一、思维导图

在这里插入图片描述

二、按位序插入

①带头结点

//在第i个位置插入元素e(带头结点)
typedef struct LNode{
	Elemtype data;
	struct LNode *next;
}LNode,*LinkList;

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){
		p=p->next;
		j++;
	} 
	if(p==NULL)return false;
	LNode *s=(LNode *)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return true;
} 

②不带头结点

//在第i个位置插入元素e(不带头结点)
typedef struct LNode{
	Elemtype data;
	struct LNode *next;
}LNode,*LinkList;

bool ListInsert(LinkList &L,int i,Elemtype e){
	if(i<1) return false;
	if(i==1){//插入第1个结点的操作与其他结点操作不同 
		LNode *s=(LNode *)malloc(sizeof(LNode));
		s->data=e;
		s->next=L;
		L=s;//头指针指向新结点 
		return true; 
	}
	LNode *p;//指针p指向当前扫描到的结点 
	int j=1;//当前p指向的是第几个结点 
	p=L;//p指向第1个结点(不是头结点) 
	while(p!=NULL&&j<i-1){
		p=p->next;
		j++;
	} 
	if(p==NULL)return false;
	LNode *s=(LNode *)malloc(sizeof(LNode));
	s->data=e;
	s->next=p->next;
	p->next=s;
	return true;
} 

二、指定结点的后插操作

//后插操作:在p结点之后插入元素e 
typedef struct LNode{
	Elemtype data;
	struct LNode *next;
}LNode,*LinkList;

bool ListInsert(LNode *p,Elemtype 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结点之前插入元素e 
typedef struct LNode{
	Elemtype data;
	struct LNode *next;
}LNode,*LinkList;
bool ListInsert(LNode *p,Elemtype 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连接到p之后 
	s->data=p->data;//将p中元素复制到s中 
	p->data=e;//p中元素覆盖为e 
	return true; 
}

四、按位序删除

//按位序删除(带头结点) 
typedef struct LNode{
	Elemtype data;
	struct LNode *next;
}LNode,*LinkList;
bool ListDelete(LNode *p,int i,Elemtype e){
	if(i<1) return false;
	LNode *p;
	int j=0;
	p=L;
	while(p!=NULL&&j<i-1){
		p=p->next;
		j++;
	}
	if(p==NULL) return false;
	if(p->next==NULL) return false;
	LNode *q=p->next;
	e=p->data;
	p->next=q->next;
	free(q);
	return true; 
}

五、指定结点的删除

//删除指定结点p
bool Delete(LNode *p){
	if(p==NULL) return false;
	LNode *q=p->next;
	p->data=p->next->data;
	p->next=q->next;
	free(q);
	return true;
} 
;