单链表的插入删除
1.按位序插入(带头结点)
bool insert1(LinkList &L, int i, int e){
if(i < 1){
return false;
}
LNode *p;
int j = 0;//j表示当前p指向的是第几个结点
p = L;
while(p != null && j < i - 1){
p = p->next;
j++;
}
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;
}
封装后代码(把指定结点的后插操作封装成一个函数)
bool insert(LinkList &L, int i, int e){
if(i < 1){
return false;
}
LNode *p;
int j = 0;//j表示当前p指向的是第几个结点
p = L;
while(p != null && j < i - 1){
p = p->next;
j++;
}
return nodeNextInsert(p, e);
}
封装后代码(把指定结点的后插操作封装成一个函数)
bool insert(LinkList &L, int i, int e){
LNode *p = getElemLinkList1(L, i-1);
return nodeNextInsert(p, e);
}
2.按位序插入(不带头结点)
bool insert2(LinkList &L, int i, int e){
if(i == 1){
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = L;//新结点的next指针指向L指向的结点 //改(难理解)
L = s;//头指针指向新结点 //改(难理解)
return true;
}
LNode *p;
int j = 1;
p = L;//p指向第1个结点(注意:不是头节点)
while(p != null && j < i - 1){
p = p->next;
j++;
}
return nodeNextInsert(p, e);
}
3.指定结点的后插操作
bool nodeNextInsert(LNode *p, int 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;
}
4.指定结点的前插操作
时间复杂度:O(1)
bool nodePriorInsert(LNode *p, int 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;
}
5.按位序删除
bool delete1(LinkList &L, int i, int &e){//改
LNode *p = getElemLinklist1(L, i-1);
if(p == null){
return false;
}
if(p->next == null){
return false;
}//第i-1个结点后已无其他结点 //改(难理解)
LNode *q = p->next;//改(令q指向被删除的结点)
e = q->data;//改 //用e返回元素值
p->next = q->next;//改
free(q);(改)
return true;
}
6.指定结点的删除
时间复杂度:O(1)
//删除指定结点p
bool delete2(LNode *p){//改
if(p == null){
return false;
}//改
LNode *q = p->next;//改 //令q指向*p的后继结点
p->data = p->next->data;//改 //和后继结点交换数据域
p->next = q->next;//改 //将*q结点从链中“断开”
free(q);//改
return true;//改
}//大改
如果p是最后一个结点的话,p–>next–>data这个地方会有bug。