一:GetElem(L,i,e) //取链表中第i个数据元素
单链表是一种顺序存储的结构,为取到第i个数据元素,必须找到第i-1个数据元素。因此,查找第i个数据元素的具体操作为:移动指针,比较k(指针指向的位置)和i
Status GetElem(LinkList L,int i,ElemType &e)
//L是带有头结点的链表的头指针,以e返回第i个元素
{
p=L->next; //p指向第一个结点
k=1; //计数器
while(p&&k<i){
p=p->next; //按顺序向后查找,直到p指向第i个元素或p为空结束循环
++k;
}
if(!p||k>i)
return ERROR; //第i个元素不存在
e=p->data; //取到第i个元素
return TRUE;
}
算法的时间复杂度为O(ListLength(L))
二:ListInsert(&L,i,e) //在第i个位置上插入数据元素
在链表中插入结点只需要修改指针,具体操作为:找到第i-1个结点,修改其指向后继的指针
Status ListInsert(LinkList L,int i,ElemType e)
//L为带头结点的单链表的头指针,本算法在链表中第i个结点之前插入新的元素e
{
p=L;
k=0;
while(p&&k<i-1)//寻找第i-1个结点
{
p=p->next;
k++;
}
if(!p||k>i-1)
return ERROR;
s=(LNode*)malloc(sizeof(LNode));//生成新的结点
if(s==NULL)
return ERROR;
s->data=e;
s->next=p->next;
p->next=s;//插入完成
return TRUE;
}
算法的时间复杂度为O(ListLength(L))
三:ListDelete(&L,i,e) //删除第i个位置上的数据元素
具体操作:找到线性表中的第i-1个结点,修改其指向后继的指针。
Status ListDelete(LinkList L,int i,ElemType &e)
{
p=L;
j=0;
while(p&&j<i-1)//寻找第i-1个结点
{
p=p->next;
j++;
}
if(!(p->next)||j>i-1)
return ERROR;//删除位置不合理
q=p->next;
p->next=q->next;
e=q->data;
delete(q)//删除并释放结点
return TRUE;
}
算法的时间复杂度为O(ListLength(L))
四:ClearList(&L) //重置线性表为空表
void ClearList(&L)
{
while(L->next)
{
p=L->next;
L-next=p->next;
delete(p);
}
}