发现某经典教材上的一个链表部分的小错误,不知是否是我理解有误?
最近在学数据结构,看的书是<数据结构、算法与应用 -- C ++语言描述>,
发现程序3-15实现向链表中插入元素时,没有考虑在头结点之前插入的情况(k = 0),代码如下:
template <typename T>
ChainList<T>& ChainList<T>::Insert(int k , const T& v)
{
if(k < 0) throw out_of_range("k < 0 是不行的");
ChainNode<T> * p = head;
for(int index = 1 ; index < k && p; k++ )
{
p = p->link;
}
if(k > 0 && !p) throw out_of_range(" 不存在第k 个元素");
ChainNode<T> *y = new ChainNode<T>;
y->data = v;
if(k){
y->link = p->link;
p->link = y;
}else
{
y->link = head;
head = y;
}
return *this;
}
for(int index = 1 ; index < k && p; k++ )//这里应该不是k++是index++吧。。
//1)这里跳过了 k=0的情况----已经考虑了k=0的情况了,这一步,先不处理 k=0的情况.
for(int index = 1 ; index < k && p; k++ ) { p = p->link; }
//2 这里分别处理了k>0 和 k=0 的情况了!
if(k){ y->link = p->link; p->link = y; }
else { y->link = head; head = y; } //这里处理了k=0 的情况了.
//相当于
if(k!=0){ y->link = p->link; p->link = y; }
else //if (k==0)
{ y->link = head; head = y; }
template <typename T>
ChainList<T>& ChainList<T>::Insert(int k , const T& v)
{
if(k < 0)
{
throw out_of_range("k < 0 是不行的")
}
else if( k == 0 )
{
ChainNode<T> *y = new ChainNode<T>;
y->data = v;
y->link = head;
head = y;
}
else
{
ChainNode<T> * p = head;
for(int index = 1 ; index < k && p; k++ )
{
p = p->link;
}
if(k > 0 && !p)
{
throw out_of_range(" 不存在第k 个元素");
}
else
{
ChainNode<T> *y = new ChainNode<T>;
y->data = v;
y->link = p->link;
p->link = y;
}
}
return *this;
}