题目一
已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值大于mink且小于maxk的元素(若表中存在这样的元素),同时释放被删结点空间,并分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值可以和表中的元素相同,也可以不同)
思想
首先排除两个错误的情况:1、L为空或不存在,2、mink>maxk
其次问题是删除结点,循环整个表,满足条件的free掉,不满足则指向下一个结点
代码
Status T219(LinkList L,int mink,int maxk)
{
LinkList p,pre,s;
if(!L||!L->next) //L不存在或者为空表时返回错误
return ERROR;
if(mink>=maxk) //当阙值设置错误时,返回错误
return ERROR;
pre=L;
p=pre->next;
while(p&&p->data<maxk)
{
if(p->data<=mink)
{
pre=p;
p=p->next;
}
else
{
s=p;
pre->next=p->next;
p=p->next;
free(s);
}
}
return OK;
}
题目二
已知线性表中的元素以值递增有序排列,并以单链表作存储结构。试写一高效的算法,删除表中所有值相同的多余元素(使得操作后的线性表中所有元素的值均不相同),同时释放被删结点空间,并分析你的算法的时间复杂度
思想
这个题目跟上面题目类似,判断条件换为当pre->data=p->data即可
代码
Status T220(LinkList L)
{
LinkList p,pre,s;
if(!L||!L->next)
return ERROR;
pre=L->next;
p=pre->next;
while(p)
{
if(pre->data=p->data) //满足条件,则删除这个结点
{
s=p;
pre->next=p->next;
p=p->next;
free(s);
}
else
{
pre=p;
p=p->next;
}
}
return OK;
}