题目
已知指针la和lb分别指向两个无头结点单链表中的首元结点。下列算法是从表la中删除自第i个元素起共len个元素后,将它们插入到表lb中的第j个元素之前。
思路
在la中查找第i个结点,用p标记当前结点,有prep标记当前结点的前一个结点;删除这前p个结点,即将prep的next指向其他结点;又插入到表第j个元素之前,即指向lb中第j个元素,lb指向p,注意是无头结点的单链表,因此第一个结点处不同。
代码段
Status T216(LinkList *la,LinkList *lb,int i,int j,int len)
{
LinkList p,q,s,prep;
int k;
if(i<0||j<0||len<0)
return INFEASIBLE;//当i,j,len有一个小于0返回错误
p=*la;
k=1;
prep=NULL;
while(p&&k<i)
{
prep=p;
p=p->next;
k++;
} //在la中查找第i个结点,用p标记,prep指向p的前一个结点
if(!p) //p为空则返回错误
return INFEASIBLE; //找不到第i个元素则返回错误
q=p; //p指向la中第i个结点
while(q&&k<i+len-1)
{
q=q->next;
k++;
} //查找la中第i+len-1个结点,用q标记
if(!q)
return INFEASIBLE;
if(!prep) //i=1的情况,prep等于空时
*la=q->next;
else //完成删除
prep->next=q->next;
if(j==1)
{
q->next=*lb; //j=1时同无头结点的插入,个人理解
*lb=p;
}
else
{
s=*lb;
k=1;
while(s&&k<j-1) //查找lb中第j-1个元素
{
s=s->next; //当j不等于1的时候,找到j的前一个结点,赋给s,然后q插入到lb
k++;
}
if(!s)
return INFEASIBLE;
q->next=s->next;
s->next=p; //完成插入
return OK;
}
}
题目二
设计在无头结点的单链表中删除第i个结点
思想
先判断i位置的合法性,当i<0或i>n-1时,不允许进行删除操作
代码
void delete(LinkList *q,int i)
{
LinkList *p,*s;
int j;
if(i<0)
printf("ERROR");
else if(i==0)
{
s=q;
q=q->next;
free(s);
}
else
{
j=0;
s=q;
while((j<i)&&(s!=NULL))
{
p=s;
s=s->next;
j++;
}
if(s==NULL)
printf("ERROR");
else
{
p->next=s->next;
free(s);
}
}
}