EDA365电子论坛网
标题:
单链表的插入和删除
[打印本页]
作者:
Titianyeer
时间:
2016-7-13 15:05
标题:
单链表的插入和删除
在单链表中,又如何实现“插入”和“删除”操作呢?
" Y, V' x+ n% {% E& e! G; G
假设我们要在线性表的两个数据元素a和b之间插入一个数据元素x,已知p为其单链表存储结构中指向结点a的指针。
& L( L& q: `/ z' V6 e
为插入数据元素x,首先要生成一个数据域为x的结点,然后插入在单链表中,根据插入操作的逻辑定义,还需要修改结点a中的指针域,令其指向结点x,而结点x中的指针域应指向结点b,从而实现3个元素a、b和x之间逻辑关系的变化。插入后的单链表所示。假设s为指向结点x的指针,则上述指针修改用语句描述即为
; W; R8 h$ R8 t
s->next=p->next;p->next=s;
1 _/ a! C: X- P8 H
反之,在线性表中删除元素b时,为在单链表中实现元素a、b和c之间逻辑关系的变化,仅修改结点a中的指针域即可。假设p为指向结点a的指针,则修改指针的语句为
! A, n) F" U: D% a- t
p->next= p->next->next
2 P0 ^2 B0 j8 D; N2 O5 j1 ]
可见,在一直链表中元素插入或删除的确切位置的情况下,在单链表中插入或删除一个结点时,仅需修改指针而不需要移动元素。
& I) E) w* y" ?# o, f' q6 I
Status ListInsert_L(LinkList &L,inti,ElemType e){
5 ]! j4 T/ s) a, C: e! s
//在带头结点的单链线性表L中第i个位置之前插入元素e
5 U1 W) c- ?4 @8 R+ L# m
p=L;j=0;
- j4 K/ Z" l) B+ d
while(p&&j<i-1){p=p->next;++j}//寻找第i-1个结点
! Y |8 ^% O& @' g
if(!p||j>i-1)return ERROR; //i小于1或者大于表长+1
* j7 `) F2 M3 N! i; x! {3 W
s=(LinkList)malloc(sizeof(LNode));//生成新结点
# a0 T- U5 E' E
s->data=e;s->next=p->next; //插入L中
$ @( ?3 l" V. M8 P
p->next=s;
- E1 z; l2 t; ^' W* n% S
return OK;
1 o& k- B+ b+ c/ p" [4 r/ v, o7 I
}//ListInsert_L
{3 z( ~4 W) x n: ~
void ListDelete_L(LinkList &L,inti,ElemType &e){
/ i2 x5 R) _6 {. k
//在带头结点的单链线性表L中,删除第i个元素,并用e返回其值
: G$ ^! ?$ d3 c, b+ s) \
p=L;j=0;
, S; A6 m2 v7 G4 m1 t3 u
while (p->next&&j<i-1){//寻找第i个结点,并令p指向其前驱
: ^. v5 g( m( A" T" g3 [7 M
p=p->next;++j;
! M! o& K! g& A
}
1 C+ X, P0 S" } h
if(!(p->next||j>i-1)return ERROR;//删除位置不合理
8 N3 X2 z- r! \1 u7 g
q=p->next;p->next=q->next; //删除并释放结点
( \/ u& g7 g7 I X E) n+ u
e=q->data;free(q);
' Z" ~) u; v( z# b/ H" g3 ~; x! b* F2 J
return OK;
& x, w# c- x5 Q( R& _
}//ListDelete_L
作者:
Gegu
时间:
2016-7-14 14:31
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O哈哈
5 Q* S5 z1 \! y' x( G1 A4 [) E
作者:
sinsaina
时间:
2016-7-14 15:01
感谢楼主分享!!!
8 A, ]: S% y4 I1 h. g
作者:
sinsaina
时间:
2016-9-12 14:20
支持楼主!谢谢分享!
8 }7 l' Y! U5 x
作者:
wu68aq
时间:
2016-9-12 14:40
学习了!3Q
6 a8 Y% z2 G$ n9 J9 m/ _" f
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2