|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在单链表中,又如何实现“插入”和“删除”操作呢?. J7 \, t2 N8 O: R
假设我们要在线性表的两个数据元素a和b之间插入一个数据元素x,已知p为其单链表存储结构中指向结点a的指针。3 Q! ~& b' P$ ]
为插入数据元素x,首先要生成一个数据域为x的结点,然后插入在单链表中,根据插入操作的逻辑定义,还需要修改结点a中的指针域,令其指向结点x,而结点x中的指针域应指向结点b,从而实现3个元素a、b和x之间逻辑关系的变化。插入后的单链表所示。假设s为指向结点x的指针,则上述指针修改用语句描述即为
! L# {6 i* O6 vs->next=p->next;p->next=s;
8 O- r h; y) \/ @1 T( X反之,在线性表中删除元素b时,为在单链表中实现元素a、b和c之间逻辑关系的变化,仅修改结点a中的指针域即可。假设p为指向结点a的指针,则修改指针的语句为
: ` b( X: o8 M; N/ O7 ^5 l5 {p->next= p->next->next; @0 }6 w0 z+ w
可见,在一直链表中元素插入或删除的确切位置的情况下,在单链表中插入或删除一个结点时,仅需修改指针而不需要移动元素。
) Z$ z3 Q3 R) X0 SStatus ListInsert_L(LinkList &L,inti,ElemType e){# i' ]) L. e7 L! r* L% ?
//在带头结点的单链线性表L中第i个位置之前插入元素e, f9 j/ P4 g( {7 M* [& |$ t: S
p=L;j=0;" i1 m4 Z- K; C% R1 |7 n
while(p&&j<i-1){p=p->next;++j}//寻找第i-1个结点
0 w0 j: ^; \4 Sif(!p||j>i-1)return ERROR; //i小于1或者大于表长+1: H! ~4 J1 m* b+ ^
s=(LinkList)malloc(sizeof(LNode));//生成新结点/ y9 T: i+ g8 V
s->data=e;s->next=p->next; //插入L中
3 c8 K7 a' @; X% y# r. Z$ V4 xp->next=s;9 ~/ @# @/ T* X$ c# d& b" Y2 W
return OK;, u9 N& O) u) S+ g, Z
}//ListInsert_L
+ U0 u( w7 V, q1 q2 q1 rvoid ListDelete_L(LinkList &L,inti,ElemType &e){
4 s. n1 V" k e6 u G* T//在带头结点的单链线性表L中,删除第i个元素,并用e返回其值
. D: Z- e1 O1 {4 q' sp=L;j=0;# w- e; b5 v0 [: `8 v
while (p->next&&j<i-1){//寻找第i个结点,并令p指向其前驱9 p1 k. U7 ~- P, K5 a6 y
p=p->next;++j;; n& ?. k W! G7 K! g0 R3 \4 k
}
. }. y& m& G8 _if(!(p->next||j>i-1)return ERROR;//删除位置不合理) z, ^& i; T' ]
q=p->next;p->next=q->next; //删除并释放结点* X9 R$ R' }' |( X# g
e=q->data;free(q);
6 {7 q6 a5 C3 O, ^return OK;, S8 A/ A& l( |0 o! @. [
}//ListDelete_L |
|