|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在单链表中,又如何实现“插入”和“删除”操作呢?
. G8 s, ^( j9 X& O假设我们要在线性表的两个数据元素a和b之间插入一个数据元素x,已知p为其单链表存储结构中指向结点a的指针。/ e5 e M: @ b* J# u' m
为插入数据元素x,首先要生成一个数据域为x的结点,然后插入在单链表中,根据插入操作的逻辑定义,还需要修改结点a中的指针域,令其指向结点x,而结点x中的指针域应指向结点b,从而实现3个元素a、b和x之间逻辑关系的变化。插入后的单链表所示。假设s为指向结点x的指针,则上述指针修改用语句描述即为2 j5 ?. M& l) z( _3 U3 |! t/ g
s->next=p->next;p->next=s;3 _- b; t4 v0 z6 d& K4 Z" {& p3 v6 Y
反之,在线性表中删除元素b时,为在单链表中实现元素a、b和c之间逻辑关系的变化,仅修改结点a中的指针域即可。假设p为指向结点a的指针,则修改指针的语句为
2 k* [% M( A1 ]: y* A7 z7 W. N& ]p->next= p->next->next
% T1 _& c; Z2 k/ p; }3 [可见,在一直链表中元素插入或删除的确切位置的情况下,在单链表中插入或删除一个结点时,仅需修改指针而不需要移动元素。
) I E: _6 ]2 `5 `/ qStatus ListInsert_L(LinkList &L,inti,ElemType e){
6 v5 U' x+ o( |. ?//在带头结点的单链线性表L中第i个位置之前插入元素e
7 ?3 p% ^5 C% ~# U' t2 X8 B+ `p=L;j=0;( f2 h* O- t4 @; O1 ~) e
while(p&&j<i-1){p=p->next;++j}//寻找第i-1个结点: l7 W) ]0 {7 w$ x
if(!p||j>i-1)return ERROR; //i小于1或者大于表长+17 S1 r1 x9 g1 r& W* Y) J
s=(LinkList)malloc(sizeof(LNode));//生成新结点& I( y9 f) K! A: V
s->data=e;s->next=p->next; //插入L中( p5 c/ U& G9 C( _; c+ I
p->next=s;1 R- e! U7 G" |# |5 B: h! o
return OK;
+ P; V( P# G# R# m7 e- o}//ListInsert_L7 g; v1 Y& t1 u* [' k
void ListDelete_L(LinkList &L,inti,ElemType &e){ M3 w$ y$ X# ~+ T+ l; R2 a
//在带头结点的单链线性表L中,删除第i个元素,并用e返回其值
3 i9 Z; H$ |6 Yp=L;j=0;
. `$ v3 D! ]& V2 nwhile (p->next&&j<i-1){//寻找第i个结点,并令p指向其前驱, y$ L1 M+ j) v0 u9 ]! L1 p
p=p->next;++j;; C h" a: R1 W( K7 M4 P3 e
}6 |) O3 R. J$ u8 w' g
if(!(p->next||j>i-1)return ERROR;//删除位置不合理5 K2 ]" E, n6 ^# y6 |
q=p->next;p->next=q->next; //删除并释放结点: ~& H, f' f% Y% O* j& j
e=q->data;free(q);0 V9 w- y* t6 G$ d3 |- N
return OK;
6 P, @) @2 y7 e4 ?1 j}//ListDelete_L |
|