一,单链表的插入
(1)单链表如何插入一个新元素呢?
在单链表中
有序对:
变成
图例:
注意:在单链表中插入只需要修改指针。若要在第 i 个结点之前插入元素,修改的是是第 (i-1) 个结点的指针。
(2)单链表的插入元素的代码怎么写呢?
代码如下:
Status ListInsert(LinkList &L, int i ,ElemType e){
p=L;
j=0;
while(p && j<i-1){
p=p->next;
++j;
}
if(p && j==i-1){
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}else{
return ERROR;
}
}
分析:在上面这个单链表插入元素这个算法中,L为带头结点的单链表的头指针,在链表中第 i 个结点之前插入新的元素 e 。while循环的作用是,寻找第(i-1)个结点。
核心算法:
生成新结点s
s=(LinkList)malloc(sizeof(LNode));
为新节点s赋值
s->data=e;
让s 的next域指向 p 的next域,p就和ai 建立联系
s->next=p->next;
让p next域指向 s 的next域,p又和s 建立了联系
p->next=s;
成功插入新节点 e
图例:
二,单链表的删除
(1)单链表如何插入一个新元素呢?
在单链表中
有序对:
变成
图例:
注意:在单链表中删除第 i 个结点时,要到单链表中第(i-2)个结点,修改其指向后继的指针。
(2)单链表的删除元素的代码怎么写呢?
代码如下:
Status ListDelete(LinkList &L, int i ,ElemType &e){
p=L;
j=0;
while(p->next && j<i-1){
p=p->next;
++j;
}
if(p->next && j==i-1){
q=p->next;
p->next=q->next;
e=q->next;
free(q);
return OK;
}else{
return ERROR;
}
}
分析:在上面这个单链表删除元素这个算法中,L为带头结点的单链表的头指针,在单链表中删除第 i 个结点元素 。while循环的作用是,寻找第(i-1)个结点,并且让 p 指向它
核心算法:
让 q 指向 p 的 next域,防止链的断裂,一旦断裂,后面的元素就找不到了
q=p->next;
让 p 指向 q 的next域,其实 p指向的也是是 p 的next 的 next 域
p->next=q->next;
让 e 存储 q指向的元素的值,也就是我们要删除的值,为了安全,我们先要删除的这个值保存起来,防止以后使用
e=q->next;
清空结点 q 的内存
free(q);
return OK;
图例: