单链表的插入和删除
一、思维导图
二、按位序插入
①带头结点
//在第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;
}