• 例1-6:在单链表中实现线性表的插入运

算INSERT (L,x,i)

算法思想:

(1)先求出第i-1个结点

(2)然后在第i-1个结点之后插入结点x 。

1

• 按序号查找

设单链表的长度为n,要查找表中第i个

结点,算法思想如下:

从头结点开始顺链扫描,用指针p指向当

前扫描到的结点,用j作统计已扫描结点

数的计数器,当p扫描下一个结点时,j

自动加1。

P的初值指向头结点,j的初值为0。

当j=i时,指针p所指的结点就是第i个结

点。

2

• 按序号查找算法描述

JD *GET(head,i)
JD *head;
int i;
{int j;
JD *p;
p=head;j=0;
while((p->next!=null&&(j
{p=p->next;j++;}
if (i=j) return p; /*找到第i个结点*/
else return null; /*找不到,收返回null*/
}/*end*/

3

• 例1-6的实现:

INSERT (L,x,i)
JD *L;
datatype x;
int i;
{JD *p;
int j;
j=i-1;
p=GET(L ,j );/*找到第i-1个结点*p*/
if (p==null) printf(“找不到插入点\n“ )
else INSERA(p,x);
}/*end*/

4

(4)删除运算

(删除单链表中*p的后继)

• 规格(结点类型)说明见单链表描述。

• 算法描述:

DeleteA(p) /*删除*p的后继结点*r,设*r存在*/
JD *p;
{JD *r;
if(p->next!=null)
r=p->next; p r
p->next=r->next; 存储池
free(r);
}
}/*enddelete*/

5

• 思考:

(1)如何删除单链表中p结点本身?

(2 )如何删除单链表中p结点的前趋结

点?

例1-7:在单链表上实现线性表的删除运

算Delete(L,i) 。

思想:先找到被删结点(第i个)的前趋

结点,即第i-1个结点*p,然后删除*p的后

继( 需引用函数GET (L,i) ) 。

6

• 例1-7的实现:

DELETE(L,i)
JD *L;
int i;
{JD *p;
int j;
j=i-1;
p=GET(L ,j) ;/*找到第i-1个结点*p*/
if ((p!=null)&&(P->next!=null))
DeleteA(P);
else printf(“error