看到数据结构的题了,觉得先要把基础什么的复习一下,首先是链表~
链表的基本操作:插入、删除、输出什么的都很重要。
单链表节点定义:
//单链表节点类的定义
template <class Elem>
class Link
{
public:
Elem element;
Link *next;
Link(const Elem& elemval, Link* nextval = NULL)//构造函数,*next=NULL
{
element = elemval;
next = nextval;
}
};
链表定义:
template <class Elem>
class LList :public List<Elem>
{
private:
Link<Elem>* head;//头指针
Link<Elem>* tail;//尾指针
Link<Elem>* fence;//当前指向位置
void init()
{
fence = tail = head = new Link<Elem>;
}
void removeall()
{
while (head != NULL)
{
fence = head;
head = head->next;
delete fence;
}
}
public:
LList()//构造函数
{
init();
}
~LList(){ removeall(); }
void clear(){ removeall(); init(); }
bool insert(const Elem&);//在fence指向的元素后插入数据
bool append(const Elem&);//在整条链表的尾部插入数据
bool remove(Elem&);
void print() const;//输出链表
void next()
{
if (fence != tail)
{
fence = fence->next;
}
}
};
记住这几个基本操作:
template <class Elem>
bool LList<Elem>::insert(const Elem& item)//在fence指针后插入元素
{
fence->next = new Link<Elem>(item, fence->next);//新插入节点的next指向原先fence的next,fence的next指向新插入节点
if (tail == fence)
{
tail = fence->next;
}
return true;
}
template<class Elem>
bool LList<Elem>::append(const Elem& item)//在链表末尾插入元素
{
tail = tail->next = new Link<Elem>(item, NULL);//插入的新节点的next指向NULL,tail指针的next指向新节点,最后浆tail指向新节点
return true;
}
template<class Elem>
bool LList<Elem>::remove(Elem& it)//删除fence指向的元素的下一元素
{
if (fence->next == NULL)
return false;
it = fence->next->element;//it即为fence的下一元素的数据域
Link<Elem>* ltemp = fence->next;
fence->next = ltemp->next;//fence的next指针指向要删除元素的下一指针
if (tail == ltemp)
{
tail = fence;//如果要删除的节点是尾节点,必须使tail指向当前节点
}
delete ltemp;//删除
return true;
}
template<class Elem>
void LList<Elem>::print() const//从头到尾输出链表
{
Link<Elem>* temp = head;
while (temp->next != NULL)
{
cout << temp->next->element << " ";
temp = temp->next;
}
}
279

被折叠的 条评论
为什么被折叠?



