|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在单链表中,又如何实现“插入”和“删除”操作呢?
% d D5 V0 M7 z& R0 |1 Y# h: A假设我们要在线性表的两个数据元素a和b之间插入一个数据元素x,已知p为其单链表存储结构中指向结点a的指针。 Q: ^4 O0 Q& Y
为插入数据元素x,首先要生成一个数据域为x的结点,然后插入在单链表中,根据插入操作的逻辑定义,还需要修改结点a中的指针域,令其指向结点x,而结点x中的指针域应指向结点b,从而实现3个元素a、b和x之间逻辑关系的变化。插入后的单链表所示。假设s为指向结点x的指针,则上述指针修改用语句描述即为: q) j+ B6 C+ g
s->next=p->next;p->next=s;3 U" ?% b$ x. m0 L2 B# D7 e
反之,在线性表中删除元素b时,为在单链表中实现元素a、b和c之间逻辑关系的变化,仅修改结点a中的指针域即可。假设p为指向结点a的指针,则修改指针的语句为2 h8 F, B2 i* J# Y$ w
p->next= p->next->next
; j* T& z) ^9 V+ }0 X! ^+ Q: b可见,在一直链表中元素插入或删除的确切位置的情况下,在单链表中插入或删除一个结点时,仅需修改指针而不需要移动元素。# H/ c" {& P# _$ _4 M: m2 C W3 _
Status ListInsert_L(LinkList &L,inti,ElemType e){# L7 L8 H) m1 U4 }: L! k0 ~
//在带头结点的单链线性表L中第i个位置之前插入元素e& A/ d3 b0 |% Q( A+ i7 E
p=L;j=0; `7 `) H* B5 W5 H$ E, h/ |
while(p&&j<i-1){p=p->next;++j}//寻找第i-1个结点3 {* b1 h4 r3 @& Y/ R1 }* C
if(!p||j>i-1)return ERROR; //i小于1或者大于表长+1# S8 E3 X- j9 _7 @" G
s=(LinkList)malloc(sizeof(LNode));//生成新结点8 o# p R2 Q% A
s->data=e;s->next=p->next; //插入L中% }2 ^' T, c& `
p->next=s;- _2 l# K. `5 G% Z0 b1 K
return OK;
2 K0 g7 M# R, D' [( T}//ListInsert_L
4 C7 V! N: ^+ l) dvoid ListDelete_L(LinkList &L,inti,ElemType &e){
, l7 _7 u1 w* B1 X2 ?: S//在带头结点的单链线性表L中,删除第i个元素,并用e返回其值
& u% f* b$ o. x. f9 S+ J4 K8 Tp=L;j=0;5 @# d) a! |0 B! n. M0 f6 d/ p. |- \
while (p->next&&j<i-1){//寻找第i个结点,并令p指向其前驱
& h# L0 H* S1 T: wp=p->next;++j;( F" r0 I( x- l0 ~
}
+ R# N: _3 c M& d# _3 ?, tif(!(p->next||j>i-1)return ERROR;//删除位置不合理
- S. }) ` \. u( hq=p->next;p->next=q->next; //删除并释放结点
: W$ l: A' |3 [( }: k" o, @e=q->data;free(q);3 u. u7 Y- P' G4 i. V' ?2 A% s
return OK;6 q: {7 Q1 z, u
}//ListDelete_L |
|